getSubimage() ignoriert Startposition

kodela

Bekanntes Mitglied
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:

1612605966083.png

und hier, wie es über das Clipboard aussieht:

1612606314802.png

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:

LimDul

Top Contributor
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.
Das wage ich zu bezweifeln.

Was du tust => Erzeugst eine leere Leinwand, die eine kleinere Größere hast
Dann malst du dann Board drauf, woher soll das wissen, dass es nicht bei 0,0 sondern erst bei r,r malen sollen?

Du musst erst das Board auf die große Leinwand malen und dann das Image beschneiden - nicht anders rum. Sprich die Zeile "c.paintAll(g);" muss vor das Subimage erstellen.
 

kodela

Bekanntes Mitglied
Unterstellt man mir, dass ich ein Märchenerzähler bin? Hier der Code-Ausschnitt für die Ausgabe in eine Datei:

[CODE lang="java" title="12"] Component c = strApp.getStradokuFeld();
int w = c.getWidth();
int r = StradokuBoard.getStrBorder();
BufferedImage img = new BufferedImage(w, w, BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
c.paintAll(g);
g.dispose();
try {
if (rand) {
ImageIO.write(img, "png", new File(pngDir));
} else {
ImageIO.write(img.getSubimage(r, r, w-2*r, w-2*r),
"png", new File(pngDir));
}
} catch (IOException e) {
JOptionPane.showMessageDialog(strApp,
"Beim Speichern der Bild-Datei ist ein "
+ "unbekannter Fehler aufgetreten.",
"Hinweis", 1);
return;
}[/CODE]

kodela
 

LimDul

Top Contributor
Unterstellt man mir, dass ich ein Märchenerzähler bin? Hier der Code-Ausschnitt für die Ausgabe in eine Datei:

[CODE lang="java" title="12"] Component c = strApp.getStradokuFeld();
int w = c.getWidth();
int r = StradokuBoard.getStrBorder();
BufferedImage img = new BufferedImage(w, w, BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
c.paintAll(g);
g.dispose();
try {
if (rand) {
ImageIO.write(img, "png", new File(pngDir));
} else {
ImageIO.write(img.getSubimage(r, r, w-2*r, w-2*r),
"png", new File(pngDir));
}
} catch (IOException e) {
JOptionPane.showMessageDialog(strApp,
"Beim Speichern der Bild-Datei ist ein "
+ "unbekannter Fehler aufgetreten.",
"Hinweis", 1);
return;
}[/CODE]

kodela
Es ist nicht das gleiche.

Hier ist der Unterschied, genau der den ich oben beschrieben habe.

Erst malen - dann verkleinern.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Mit getSubimage ruckelt das Bild AWT, Swing, JavaFX & SWT 7
T Zeichnen von getSubimage funktioniert nicht AWT, Swing, JavaFX & SWT 7
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
H setToolTipText ignoriert HTML-Formatierung des anzuzeigenden Strings AWT, Swing, JavaFX & SWT 4
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
X Button ignoriert disable? AWT, Swing, JavaFX & SWT 7
M Horizontal Scrollbar wird ignoriert AWT, Swing, JavaFX & SWT 10
D JList ignoriert Einstellungen AWT, Swing, JavaFX & SWT 4
E JTextPane setText ignoriert \n AWT, Swing, JavaFX & SWT 6
R BoxLayout(Y_Axis) ignoriert preferedSize von Buttons AWT, Swing, JavaFX & SWT 5
M SWT java.util.Locale wird ignoriert ? AWT, Swing, JavaFX & SWT 5
B AWT FileDialog Filter wird ignoriert AWT, Swing, JavaFX & SWT 7
W Swing Problem: setLocation und setBounds werden ignoriert... AWT, Swing, JavaFX & SWT 3
J JscrollPane ignoriert ComponentOrientation AWT, Swing, JavaFX & SWT 5
C JScrollPane ignoriert JPanel mit überschriebener pai.nt() AWT, Swing, JavaFX & SWT 11
P Ignoriert mein setSize()? AWT, Swing, JavaFX & SWT 2
J KeyListener wird ignoriert AWT, Swing, JavaFX & SWT 18
K Java3D - Startposition ? AWT, Swing, JavaFX & SWT 5
lin Startposition einer ScrollBar AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben