Hello,

Je souhaite sauvegarder un JPanel sous forme d'image JPEG. Problème: l'image sauvegardée est systématiquement noir. Voici mon code, la classe héritant de JPanel:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
@Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println("ASKING TO PAINT");
 
        Graphics2D g2d = (Graphics2D) g;
        renderer.render(g2d, getSize());
 
        g2d.setPaint(Color.RED);
        g2d.fillRect(10, 10, 20, 20);
    }
 
    public void saveImage() {
        int returnVal = fc.showOpenDialog(this);
        if(returnVal != JFileChooser.APPROVE_OPTION) return ;
 
        File f = fc.getSelectedFile();
 
        int w = getWidth() ;
        int h = getHeight();
 
        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = bi.createGraphics();
//        g.clearRect(0, 0, w, h);
//        g.setBackground(Color.WHITE);
//        g.setPaint(Color.WHITE);
//        g.fillRect(0, 0, w, h);
 
        paint(g);
        g.dispose();
 
        // Get the file
        try{
            OutputStream out = new BufferedOutputStream(new FileOutputStream(f));
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
 
            JPEGEncodeParam param = encoder.getJPEGEncodeParam();
            param.setQuality(0.8f, true);
 
            encoder.encode(bi);
            out.close();
//            ImageIO.write(bi, "jpeg", f);
        }
        catch (Exception e) {
            Logger.getLogger(this.getClass().getCanonicalName()).log(Level.SEVERE, "Error", e);
            JOptionPane.showMessageDialog(this, e.getMessage());
        }
    }
L'image est donc noir, tandis que si j'affiche le BufferedImage dans in dialog, tout semble OK. Si je sauvegarde l'image en png avec ImageIO, ca fonctionne aussi...

Bref, je comprends pas
Merci d'avance.