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

 Java Discussion :

Probleme avec BufferedImage


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Par défaut Probleme avec BufferedImage
    Bonjour tout le monde,


    Voila, j'ai deux problèmes avec l'utilisation de BufferedImage.

    Premièrement, lorsque je veux charger une grosse image de 3500x2500 par exemple, j'ai un "OutOfMemory Exception" lors de l'initialisation du BufferedImage.
    Sachant qu'avant l'ouverture du fichier, le programme lance juste une interface graphique assez simple, avec quelques miniatures.
    Si la JVM a 64Mo par défaut, c'est amplement suffisant pour les 3500x2500x3 = 26Mo de l'image, non ?

    Est-ce normal ?

    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
     public  BufferedImage createFullImage()
        {
     
            if(getFullImage() == null) {
                Toolkit tk = Toolkit.getDefaultToolkit();        
     
                // Création du BufferImage aux tailles de l'image
                Image TMPimg = tk.getImage(getFilename());
                TMPimg = new ImageIcon(TMPimg).getImage();
     
                 setFullImage(new BufferedImage(TMPimg.getWidth(null), TMPimg.getHeight(null), BufferedImage.TYPE_INT_RGB));
     
                // On dessine l'image dedans
                Graphics g = getFullImage().createGraphics();
                g.drawImage(TMPimg,0,0,null);
     
                g.dispose();
                TMPimg.flush();
                TMPimg = null;
     
            }
            return getFullImage();
        }


    Je sais qu'on peut étendre la mémoire allouée par la VM. Si je l'étends à 512Mo , je n'ai plus le probleme de dépassement de mémoire.
    Par contre, lorsque je veux afficher mon image dans un jPanel en redéfinissant la fonction PaintComponent, l'image est affichée 1/4 de seconde (premier passage dans Paint()), puis après n'est plus dessinée (on ne voit que le gris de fond).
    La fonction passe pourtant toujours bien sur le DrawImage lors d'un repaint et il n'y a pas ce genre de problème pour les images de plus petite taille (celles qui passaient sans étendre la mémoire).


    La seule "solution" que j'ai trouvé, c'est d'executer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     int[] mBi = new int[1];
            image.getRGB(0,0,1,1,mBi,0,1);
    lors de l'initialisation du panel. Cela a résolu mon problème mais ne me semble pas logique !



    Merci d'avance !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Est-ce normal?

    Oui, tu n'as pas 1 mais 2 images: ta bufferedImage et ton imageicon, qui est chargée par swing et reste en mémoire (voir la doc de imageicon). Tu n'as pas besoin de passer par là, tu peux simplement faire Toolkit.getDefaultToolkit().getImage(fichier)

    Pour ce qui est de ton problème d'affichage, faudrait voir ton code.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Par défaut
    Merci pour la réponse.
    Effectivement le problème de mémoire devient logique.

    Par contre,j'avais utilisé cette méthode afin d'être sur que l'image était complètement chargée.
    Si je n'utilise plus d'ImageIcon, mon image n'est pas totalement chargée lors de l'instanciation du BufferedImage.

    Je connais l'utilisation du MediaTracker, mais il est impossible de l'utiliser ici car la méthode fait partie d'une classe indépendante qui n'est pas un "Component".

    J'ai alors essayé de charger directement l'image à partir d'un ImageIcon avec le constructeur ImageIcon(String path) , mais le problème de mémoire reste présent.



    En ce qui concerne le deuxième problème, voici le code [simplifié] de mon panel

    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
     
    public class ImagePanel extends JPanel {
     
      private BufferedImage image = null;
        private int ImageWidth;
        private int ImageHeight;
     
     public ImagePanel(BufferedImage image) {
     
     
     
            this.image = image;
     
     
            this.setSize(image.getWidth(null),image.getHeight(null));
            ScrollFlowLayout SFL = new ScrollFlowLayout();
            SFL.setAlignment(ScrollFlowLayout.LEFT); SFL.setHgap(10);    SFL.setVgap(10);
            this.setLayout(SFL);
     
     
            ImageHeight = image.getHeight(null);
            ImageWidth = image.getWidth(null);
     
        }
     public void paintComponent(Graphics g) {
     
            super.paintComponent(g); // Paint background
            if (image != null) { // Une image existe : On la dessine
      [...]
                  // affichage centré
                    g.drawImage(image,this.getWidth()/2-nWidth/2,this.getHeight()/2-nHeight/2, ImageWidth, ImageHeight , this);
                [...]
             }
        }

    Merci d'avance

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Essaie avec ImageIO.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Essaie avec ImageIO.

    Merci , je viens justement d'essayer, ca passe beaucoup mieux comme ca

    Il ne reste plus que le 2eme problème

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu ne dois pas faire un setSize(), c'est le layoutmanager qui appellera cette méthode. Si tu veux préciser les tailles de ton panel, utilise setPreferredSize(), setMinimumSize() et setMaximumSize(). Aussi, je crains que pour un grosse image de 3500 pixel de large, le layoutmanager aie du mal à respecter ces contrainte tout en faisant tenir le fenêtre à l'écran. Met une bordure de couleur à ton panel, pour avoir une idée de sa taille, je pense que le 1/4 de seconde affiché, c'est avant que le layoutmanager ne dimensionne ton panel.

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par Slayor Voir le message
    3500x2500x3 = 26Mo de l'image, non ?
    x4, TYPE_INT_RGB utilise un entier (4 octets donc) pour son stockage meme si tu n'en utilises que 3.


    Plutot que Toolkit rabat-toi vers ImageIO et pense a nullifier la reference vers ton image des que tu as recupere ses valeurs RGB.

    Sinon regarde du cote de l'extension JAI (Java Advanced Imaging) s'il n'y a pas des moyens de manipuler des images de plus grande taille.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Probleme avec BufferedImage
    Par noussa_nouha dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 08/09/2006, 10h06
  2. probleme avec BufferedImage
    Par L4BiN dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 30/08/2006, 11h38
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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