Teil eines Panels als Graphik speichern

kodela

Bekanntes Mitglied
Hallo,

ich speichere ein Sudoku-Feld, das über ein JPanel angezeigt wird, als PNG-Grafikdatei ab.
Das funktioniert einwandfrei. Hier der wesentliche Code dafür:
Java:
        Component c = sudokuFeld;
        BufferedImage img = new BufferedImage(
                c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics2D g = img.createGraphics();
        c.paintAll(g);
        g.dispose();
        try {
            ImageIO.write(img, "png", new File("Sudoku.png"));
        }
Nun hat das Sudoku-Feld eine Umrahmung mit den Koordinaten für die Zeilen und Spalten, auf die ich gerne verzichten möchte. Das eigentliche Sudoku-Feld, so wie ich es ausgeben möchte, ist in der Höhe und Breite um je 48 Pixel kleiner, je 24 Pixel für den Rahmen oben und unten sowie links und rechts.

Die Größe der Ausgabe zu verändern, ginge ja sehr einfach. Ich habe nur bisher nicht herausgefunden, wie ich es anstellen muss, dass die Ausgabe nicht genau von links oben, sondern 24 Pixel nach unten und rechts versetzt beginnt.

Wer kann mir da einen Hinweis geben. Schon im Voraus einmal Danke.

Konrad
 
Danke für den Hinweis. Theoretisch müsste das auch funktionieren, praktisch aber leider nicht.

Wenn ich das Image mit "img = img.getSubImage(24, 24, b-48, h-48);" zuschneide, dann bekomme ich damit zwar eine Image in der Größe 421x421. Es beginnt aber nicht, wie man meinen sollte, 24 Pixel von oben und auch von links entfernt, sondern bei 0, 0, also an der linken oberen Ecke.

Damit habe ich links und oben den unerwünschten Rand und rechts sowie unten fehlt etwas.
Im Grunde bekomme ich das selbe Ergebnis, wie wenn ich das Image von Anfang an in der Größe b-48 x h-48 erzeugen würde.

Vor dem Aufruf von getSubImage() hat img eine Höhe von 469, eine Breite von 469, ein x-Offset von 0 und ein y-Offset von 0.

Nach dem Aufruf hat es ein Höhe von 421, eine Breite von 421, einen x-Offset von -24 und einen y-Offset von -24.
 
Zuletzt bearbeitet:
Ich habe weiter probiert und eine Lösung gefunden. So funktioniert es:

Java:
Component c = sdkApp.getSudokuFeld();
int w = c.getWidth();
int h = c.getHeight();
int r = SudokuBoard.getSdkBorder();
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
c.paintAll(g);
g.dispose();
try {
      ImageIO.write(img.getSubimage(r, r, w-2*r, h-2*r), "png", new File(pngDir));
}
Warum es auf diese Weise funktioniert und anders nicht - keine Ahnung.

Nochmals Danke für den Hinweis auf "getSubimage()"🙂!
 

Zurück
Oben