# JPanel als Bild abspeichern



## Bgag (18. Juli 2010)

Hallo!

Ich würde gerne den Inhalt eines JPanels als Bild abspeichern. Zu diesem Thema finden sich eigentlich tausende Lösungen, so auch die nachfolgende, im Netz.


```
import javax.swing.imageio.*;
import java.awt.*;

//..

public boolean saveWindowTo(String file, int x, int y, int width, int height) {

    try {
        Rectangle windowRect = new Rectangle(x, y, width, height);
        Robot robot = new Robot();
        BufferedImage image = robot.createScreenCapture(windowRect);
        return ImageIO.write(image, "png", new File(file));
    } catch (AWTException e) {
        // "platform configuration does not allow low-level input control"
        return false;
    } catch (IOException e) {
        // Fehler während des Schreibens des Bildes
        return false;
    }
}
```

Das Problem ist, dass ich bisher noch keine Lösung gefunden habe, die es mir erlaubt, auf Knopfdruck einen Dialog zum Speichern zu öffnen und dabei noch aus mehreren Formaten zu wählen. Ist dies überhaupt möglich?

Liebe Grüße,

Andreas


----------



## miffi (19. Juli 2010)

Howdie.

Erstmal ein Hinweis:
Nie nie nie nie leere catch-Blöcke bei Exceptions. Gibt dir zumindest den Stack-Trace aus (_e.printStackTrace()_) oder die Nachricht (_System.out.println(e.getMessage()_).

Aus deinem Post wird mir jetzt nicht klar, wie weit deine Java-Kenntnisse reichen oder was du schon versucht hast, daher jetzt einfach mal ein paar Stichwörter: Einen _JFileChooser_ per Knopfdruck könntest du über einen _KeyListener_ öffnen, den du bei deinem Hauptfenster oder dem besagten JPanel registrierst. Diesem Chooser kannst du einen _FileFilter_ oder _FileNameFilter_ hinzufügen, der die entsprechenden Formate bereitstellt. Aus dem FileChooser bekommst du ein _File_-Objekt zurück, das du dann an deine _saveWindowTo()_-Methode übergeben kannst.

Gruß
miffi


----------



## raptot (21. Juli 2010)

Mit dem Code kannst du ein JPanels als JPG Bild abspeichern. 
Beim Aufrufen der Methode sollte ein "Speichern als" Fenster aufgehen wo du den Speicherort angeben kannst. Danach wird das JPanel gespeichert.

Es dürfte nicht schwer sein ihn so zu erweitern, dass die das Format auswählen kannst. Dazu musst du nur den FileChooser entsprechend anpassen und dann die getroffene Auswahl abfragen.


```
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Locale;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.JFileChooser;

public class ImgStor{
    protected static void saveimg(JPanel gui){
        JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        fc.addChoosableFileFilter(new ImageFilter());
        fc.setAcceptAllFileFilterUsed(false);
        int returnval = fc.showSaveDialog(null);
        if (returnval == JFileChooser.APPROVE_OPTION){
            String file = fc.getSelectedFile().getPath();
            if (!fc.getSelectedFile().getName().endsWith(".jpg")){
                file = file + ".jpg";
            }
            int w = gui.getWidth();  
            int h = gui.getHeight();  
            BufferedImage image = new BufferedImage(w,h, BufferedImage.TYPE_INT_RGB);  
            Graphics2D big2d = image.createGraphics();
            // Male das JPanel in das BufferedImage
            gui.printAll(big2d);
            ImageWriter imageWriter = (ImageWriter) ImageIO.getImageWritersByFormatName("JPG").next();
            JPEGImageWriteParam imageWriteParam = new JPEGImageWriteParam(Locale.getDefault());
            imageWriteParam.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
            imageWriteParam.setCompressionQuality(0.9F);
            IIOImage iioImage = new IIOImage(image, null, null);
                try {
                    ImageOutputStream stream = ImageIO.createImageOutputStream(new File(file));
                    imageWriter.setOutput(stream);
                    imageWriter.write(null, iioImage, imageWriteParam);
                    stream.close();
                    } catch (IOException e){
                        System.out.println("Fehler beim Schreiben der Datei");
                        }
        }
    }
}
```


```
import java.io.File;
import javax.swing.filechooser.*;

public class ImageFilter extends FileFilter {

    public boolean accept(File f) {
        if (f.isDirectory()) {
            return true;
        }
        String filename = f.getName();
        return (filename.endsWith(".jpg") || filename.endsWith(".JPG"));
    }

    //The description of this filter
    public String getDescription() {
        return "*.jpg";
    }
}
```


----------

