Hallo,
für mein Stradoku-Programm habe ich eine Methode geschrieben, die es ermöglichen soll, das quadratische Stradoku-Feld als Image ins Clipboard einzufügen und zwar mit oder ohne Rahmen. Das funktioniert, so lange das Image unbeschnitten, also mit Rahmen übergeben wird.
Für eine Übergabe ohne Rahmen wird das Image über getSubimage() beschnitten. Die Startposition wird dabei für x und y um die Rahmenbreite verschoben und die Breite und Höhe um das Zweifache der Rahmenbreite verkleinert.
Hier der Code:
[CODE lang="java" highlight="13"] /**
* Kopiert das Stradoku-Feld in die Zwischenablage
* @param rahmen true wenn Übernahme des Feldes mit Rahmen, sonst false
*/
public void imgToClipboard(boolean rahmen) {
Component c = strApp.getStradokuFeld();
int q = c.getWidth();
int r = StradokuBoard.getStrBorder();
String mo = " mit ";
BufferedImage img = new BufferedImage(q, q, BufferedImage.TYPE_INT_RGB);
try {
if (!rahmen) {
img = img.getSubimage(r, r, q-2*r, q-2*r);
mo = " ohne ";
}
ImageSelection imgSel = new ImageSelection(img);
Graphics2D g = img.createGraphics();
c.paintAll(g);
g.dispose();
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(imgSel, null);
} catch (HeadlessException e) {
JOptionPane.showMessageDialog(strApp,
"Bei der Übernahme in die Zwischenablage "
+ "ist ein unbekannter Fehler aufgetreten.",
"Hinweis", 1);
return;
}
strApp.setHinweis("Stradoku als Bildatei"+mo+"Rand in die Zwischenablage kopiert.");
}[/CODE]
Nun zu meinem Problem:
getSubimage() ändert die Startposition nicht! Das Image wird zwar in der Breite und Höhe beschnitten, aber die Startposition bleibt wie bei einem unbeschnittenen Image bei 0 für beide Koordinaten.
In meinem Programm kann man das Stradoku-Feld, ebenso mit und ohne Rahmen, als Datei abspeichern. Dabei wird für eine Ausgabe ohne Rahmen das Image in gleicher Weise beschnitten, wie hier für die Übergabe ans Clipboard und dort funktioniert das einwandfrei.
Warum funktioniert es hier nicht?
Hier ein Bild, wie das beschnittene Feld als Datei ausgegeben wird:

und hier, wie es über das Clipboard aussieht:

Hat jemand eine Idee, warum bei der Beschneidung für das Clipboard der angegebene inke obere Punkt für das Image nicht berücksichtigt wird?
Danke für jede Hilfe,
kodela
für mein Stradoku-Programm habe ich eine Methode geschrieben, die es ermöglichen soll, das quadratische Stradoku-Feld als Image ins Clipboard einzufügen und zwar mit oder ohne Rahmen. Das funktioniert, so lange das Image unbeschnitten, also mit Rahmen übergeben wird.
Für eine Übergabe ohne Rahmen wird das Image über getSubimage() beschnitten. Die Startposition wird dabei für x und y um die Rahmenbreite verschoben und die Breite und Höhe um das Zweifache der Rahmenbreite verkleinert.
Hier der Code:
[CODE lang="java" highlight="13"] /**
* Kopiert das Stradoku-Feld in die Zwischenablage
* @param rahmen true wenn Übernahme des Feldes mit Rahmen, sonst false
*/
public void imgToClipboard(boolean rahmen) {
Component c = strApp.getStradokuFeld();
int q = c.getWidth();
int r = StradokuBoard.getStrBorder();
String mo = " mit ";
BufferedImage img = new BufferedImage(q, q, BufferedImage.TYPE_INT_RGB);
try {
if (!rahmen) {
img = img.getSubimage(r, r, q-2*r, q-2*r);
mo = " ohne ";
}
ImageSelection imgSel = new ImageSelection(img);
Graphics2D g = img.createGraphics();
c.paintAll(g);
g.dispose();
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(imgSel, null);
} catch (HeadlessException e) {
JOptionPane.showMessageDialog(strApp,
"Bei der Übernahme in die Zwischenablage "
+ "ist ein unbekannter Fehler aufgetreten.",
"Hinweis", 1);
return;
}
strApp.setHinweis("Stradoku als Bildatei"+mo+"Rand in die Zwischenablage kopiert.");
}[/CODE]
Nun zu meinem Problem:
getSubimage() ändert die Startposition nicht! Das Image wird zwar in der Breite und Höhe beschnitten, aber die Startposition bleibt wie bei einem unbeschnittenen Image bei 0 für beide Koordinaten.
In meinem Programm kann man das Stradoku-Feld, ebenso mit und ohne Rahmen, als Datei abspeichern. Dabei wird für eine Ausgabe ohne Rahmen das Image in gleicher Weise beschnitten, wie hier für die Übergabe ans Clipboard und dort funktioniert das einwandfrei.
Warum funktioniert es hier nicht?
Hier ein Bild, wie das beschnittene Feld als Datei ausgegeben wird:

und hier, wie es über das Clipboard aussieht:

Hat jemand eine Idee, warum bei der Beschneidung für das Clipboard der angegebene inke obere Punkt für das Image nicht berücksichtigt wird?
Danke für jede Hilfe,
kodela
Zuletzt bearbeitet: