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

AWT/Swing Java Discussion :

Comment récupérer une image de fond d'un JPanel?


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club Avatar de kayzra
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Points : 68
    Points
    68
    Par défaut Comment récupérer une image de fond d'un JPanel?
    Bonjour,je redéfinis JPanel afin d'obtenir une image de fond adapté au composant, mais je n'arrive pas à récupérer l'image afficher en fond par mon JPanel dans un BufferedImage ou dans un fichier en conservant la largeur et la hauteur de l'image adaptée.

    Voici la classe qui redéfinie 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
    50
    51
    52
    53
    54
     
         **/ CETTE CLASS PERMET DADAPTER LA TAILLE DE LIMAGE AU COMPOSANT QUELLE 
         * SOIT + GRANDE OU + PETITE QUE LE COMPOSANT(PANNEAU)
         */ 
        class PanneauImage extends JPanel {
     
     
     
    	private Image img;      
    	public String file;
     
            /**
            * load a image
            *@arg File = ????????.gif/jpg/png
            */	
            public PanneauImage() {
                    file = "monImage.jpg";
                    System.out.println("file " + file);
                    img = new ImageIcon(getClass().getResource(file)).getImage();
                    repaint(); 
            }
     
            /**
             * Loads the specified image, which must be a JPG, a GIF, or a PNG.
             * @param file the file to load
             */  
            public PanneauImage(String file) {
    	   this.file = file;
    	   img = new ImageIcon(getClass().getResource(file)).getImage();
    	   repaint(); 
     
            }
     
            /**
            * 
            * @return STRING IMAGE
            * @author kayzra
            */
            public String getImage() {
                return file;
            }
     
            /**
            *@Override JPanel 
            */
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (img == null) return;
                g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
     
            }
        }
    }
    Et voici comment j'ai tenté de l'adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /**
            *@Override JPanel 
            */
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (img == null) return;
                g.drawImage(img, 0, 0, getWidth(), getHeight(), this);//IF  + BOOLEAN A ETE SUPRIMER
                BufferedImage imageCompo = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
                try{
                    ImageIO.write(imageCompo, "jpg", new File("BufImagCompo.jpg"));
                }catch(Exception ex) {ex.printStackTrace();}
            }
    Avec ces modifications j'obtiens un fichier BufImagCompo.jpg tout noir avec la largeur et la hauteur égale au composant affiché au lieu d'avoir une image.

    En fait je ne vois pas comment récupérer l'image, pour ne pas créer un BufferedImage aux bonnes dimensions mais vide (noir)?

    Mes connaissances en java n'étant pas suffisante, je vous implore de bien vouloir m'apporter votre aide.

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Tu as oublié de faire ceci avant de sauvegarder l'image :

    Graphics2D g2 = imageCompo.getGraphics();
    super.paintComponent(g2);
    g2.dipose();

    Bref, tu as oublié de dessiner le composant dasn l'image.
    Romain Guy
    Android - Mon livre - Mon blog

  3. #3
    Membre du Club Avatar de kayzra
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Points : 68
    Points
    68
    Par défaut
    merci pour ton aide Gfx.

    J'ai donc utilisé le Graphics2D afin de récupérer l'image sur le composant de 2 manières différentes :

    1- J'ai utilisé Graphics2D dans paintComponent() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (img == null) return;
                g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
                BufferedImage imageCompo = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
                Graphics2D g2 = (Graphics2D) imageCompo.getGraphics(); //J'AI DU FAIRE UN CAST
                super.paintComponent(g2);
                
                try{
                    ImageIO.write(imageCompo, "jpg", new File("BufImagCompo.jpg"));
                }catch(Exception ex) {ex.printStackTrace();}
                
                g2.dispose();
            }
    J'obtiens une image en .jpg de mon composant vide (pas noire mais comme si il n'y avait aucune image sur mon composant)

    2- Dans une méthode que j'applique aprés l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void saveImageCompo() {
                Graphics2D g2 = (Graphics2D) imageCompo.getGraphics();
                super.paintComponent(g2);
                BufferedImage imageCompo = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
                try{
                    ImageIO.write(imageCompo, "jpg", new File("BufImagCompo.jpg"));
                }catch(Exception ex) {ex.printStackTrace();}
     
                g2.dispose();
            }
    J'obtiens la même chose une image d'un composant vide pourtant inséré dans une JFrame le panneau affiche l'image voulue .... Je vois pas comment résoudre mon problème, please ...

    Voici mon code complet avec la méthode main de test :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    import java.awt.Graphics;
    import java.awt.image.*;
    import java.awt.*;
    import javax.swing.*;
    import javax.imageio.*;
    import java.io.*;
    public class PanneauImage extends JPanel {
     
     
     
     
            private BufferedImage imageCompo;
    	private Image img;      
    	public String file;
     
            public PanneauImage(String file) {
    	   this.file = file;
    	   img = new ImageIcon(getClass().getResource(file)).getImage();
    	   repaint(); 
     
            }
     
     
            public String getImage() {
                return file;
            }
     
     
            @Override 
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (img == null) return;
                g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
     
                BufferedImage imageCompo = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
     
                Graphics2D g2 = (Graphics2D) imageCompo.getGraphics(); //J'AI DU FAIRE UN CAST
                super.paintComponent(g2);
     
                try{
                    ImageIO.write(imageCompo, "jpg", new File("BufImagCompo.jpg"));
                }catch(Exception ex) {ex.printStackTrace();}
     
                g2.dispose();
            }
     
            public void saveImageCompo() {
     
                BufferedImage imageCompo = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
                Graphics2D g2 = (Graphics2D) imageCompo.getGraphics();
                super.paintComponent(g2);
     
                try{
                    ImageIO.write(imageCompo, "jpg", new File("BufImagCompo.jpg"));
                }catch(Exception ex) {ex.printStackTrace();}
     
                g2.dispose();
            }
     
            /************************************************************************/
            public static void main(String[] args) {
     
                JFrame maFrame =new JFrame("Fenetre de test");
                PanneauImage pi = new PanneauImage("24.jpg");
     
                maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                maFrame.setContentPane(pi);
                maFrame.setBounds(200, 200, 400, 400);
                maFrame.setVisible(true);
                //pi.saveImageCompo();
     
            }
     
        }

  4. #4
    Membre du Club Avatar de kayzra
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Points : 68
    Points
    68
    Par défaut
    En fait pour que ça fonctionne j'ai récupéré l'image directement dans le main , a priori l'image sur le composant n'est réellement définie que quand le panneau est utilisé.

    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
    public static void main(String[] args) {
                
                JFrame maFrame =new JFrame("Fenetre de test");
                PanneauImage pi = new PanneauImage("24.jpg");
                
                maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                maFrame.setContentPane(pi);
                maFrame.setBounds(200, 200, 400, 400);
                maFrame.setVisible(true);
                //System.out.println("Taille du panneau : "+pi.getSize());
                BufferedImage imageCompo = new BufferedImage(pi.getWidth(),pi.getHeight(),BufferedImage.TYPE_INT_RGB);
                Graphics2D g2 = (Graphics2D) imageCompo.getGraphics();
                pi.paintComponent(g2);
                
                try{
                    ImageIO.write(imageCompo, "jpg", new File("BufImagCompo.jpg"));
                }catch(Exception ex) {ex.printStackTrace();}
                
                g2.dispose();
               
            
            }
    Là j'obtiens un .jpg de l'image affichée sur le panneau aux bonnes dimensions.

  5. #5
    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
    En fait tu pas plusieurs problèmes:

    1. Effectuer la création de cette image dans le paintComponent est une mauvaise idée pour des raisons de performance (çà te créer des à chaque repaint du JPanel), donc l'action doit être effectuée en dehors.
    2. Dans le code où tu effectuais cette action en dehors de la méthode paintComponent, c'était basiquement un gros foutoir.
    Voici commen procéder.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BufferedImage im = new BufferedImage(pi.getWidth(), pi.getHeight,BufferedIMage.TYPE_INT_ARGB);
    Graphics2D g2d = im.createGraphics();
    //on demande au panel de se dessiner sur les graphics de l'image
    pi.printAll(g2d);
    g2d.dispose();
    try {
       ImageIO.write(im,"png",new File("toto.png"));
    } catch ( Exception e) {
       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.

  6. #6
    Membre du Club Avatar de kayzra
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Points : 68
    Points
    68
    Par défaut
    merci sinok de m'éclairer sur ces problèmes par tes explications, le fais de pouvoir arriver à faire ce que je cherche à faire en Java est déjà une bonne chose pour moi, mais si en plus tu m'optimise le code c'est le top!

Discussions similaires

  1. [VBA] Comment récupérer une image WEB
    Par jacques13 dans le forum Général VBA
    Réponses: 9
    Dernier message: 06/02/2014, 15h58
  2. Comment récupérer une image de fond en utilisant Infomaniak
    Par Aikoo dans le forum Autres hébergeurs
    Réponses: 0
    Dernier message: 15/04/2009, 14h00
  3. Comment récupérer une image du net ?
    Par Cracking_Cow dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 01/12/2005, 21h53
  4. Réponses: 7
    Dernier message: 26/07/2005, 16h31
  5. Comment mettre une image en fond de JFrame
    Par marc26 dans le forum Débuter
    Réponses: 3
    Dernier message: 19/01/2004, 17h57

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