IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

JPanel en JPEG


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut JPanel en JPEG
    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.

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Les classes JPEGImageEncoder sont à éviter comme la peste vu que ne faisant pas partie de l'API java standard et donc susceptible d'être modifiées/déplacées/renommées entre deux versions de java.


    Il faut donc absolument passer par ImageIO et son mécanisme d'ImageWriters pour obtenir une solution pérenne.

    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
    package images;
     
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.Iterator;
     
    import javax.imageio.IIOImage;
    import javax.imageio.ImageIO;
    import javax.imageio.ImageWriteParam;
    import javax.imageio.ImageWriter;
    import javax.imageio.stream.ImageOutputStream;
     
    public class JpegCompression {
     
        public static void main(String[] args) {
     
            try {
                BufferedImage bi = ImageIO.read(JpegCompression.class
                        .getResource("/Tse2008_200_mo1.png"));
                File f = new File("hello.jpg");
                Iterator<ImageWriter> writers = ImageIO
                        .getImageWritersByFormatName("jpeg");
                ImageWriter writer = writers.next();
                ImageWriteParam params = writer.getDefaultWriteParam();
                params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                params.setCompressionQuality(0.8f);
                ImageOutputStream ios = ImageIO.createImageOutputStream(f);
                writer.setOutput(ios);
                writer.write(null, new IIOImage(bi, null, null), params);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
        }
    }
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

Discussions similaires

  1. JPanel et Border
    Par titoine dans le forum Débuter
    Réponses: 3
    Dernier message: 22/04/2003, 15h58
  2. [TP] gif et jpeg
    Par vinyl74 dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 22/12/2002, 15h02
  3. Réponses: 5
    Dernier message: 20/08/2002, 18h01
  4. Copier une image (jpeg) dans le presse papier
    Par benj63 dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2002, 14h51
  5. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo