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

Graphisme Java Discussion :

optimisation redimensionnement image


Sujet :

Graphisme Java

  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut optimisation redimensionnement image
    Bonjour,

    j'ai réalisé une petite fonction de redimensionnement d'image qui prend un lien vers un fichier en paramètre.
    Voici le code :

    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
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import java.awt.RenderingHints;
    
    public class ResizingImage {
    
        static BufferedImage imgNew = null;
        
    
        public static BufferedImage resize(int newWidth, int newHeight, String imgPath) {
    
            try {
                File imgFile = new File(imgPath);
                BufferedImage imgOld = ImageIO.read(imgFile);
                imgNew = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
    
                /// Resizing of the old image ////////////////////////
                Graphics2D g = (Graphics2D) imgNew.getGraphics();
                g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
                g.drawImage(imgOld, 0, 0, newWidth, newHeight, null);
                g.dispose();
                /////////////////////////////////////////////////////
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return imgNew;
        }
    
    
    
        public static BufferedImage resize(int newWidth, int newHeight, String imgPath, String strg) {
    
            imgNew = resize(newWidth, newHeight, imgPath);
    
            try {
                ImageIO.write(imgNew, "jpeg", new File(strg));
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return imgNew;
        }
    
    
    
        public static void main (String[] args) {
            ResizingImage.resize(320, 240, "D:/Esia/logo.jpg", "D:/test.jpg");
        }
    
    }
    Ma fonction n'est cependant pas assez "rapide". Il faudrait qu'elle demande 2 fois moins de temps CPU (mon maître de stage est drastique !).

    Après une analyse avec JProbe Profiler, il ressort que c'est principalement le "ImageIO.read(imgFile);" qui prend du temps.

    Puis-je faire autrement ?
    Puis-je optimiser d'autres parties de ma fonction.
    (le "main" est là juste pour le test)

    Je vous remercie d'avance pour votre aide.

  2. #2
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut
    PS : j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Toolkit kit = Toolkit.getDefaultToolkit();
    imgOld = kit.getImage(imgPath);
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File imgFile = new File(imgPath);
    BufferedImage imgOld = ImageIO.read(imgFile);
    en veillant à avoir des Image au lieu des BufferedImage (getImage() ne marche que sur des Image), mais ça ne marche pas. L'image générée est toute noire :/

  3. #3
    Membre expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Par défaut
    Je ne vois pas trop pourquoi tu recharges ton image à chaque fois.... Moi, j'ai une appli qui gère le zoom sur une image raster. Ce que je fais, c'est que je charge une bufferedImage au début, et après grâce aux transformations, je ne recharge plus jamais l'image (et pour toi, il faudrait utiliser scale).
    Comme dans resize, il y a re, je pense que charger ton image au début est suffisant, ensuite tu dessines ton image sur le canvas en modifiant sa taille en fonction du redimensionnement. Et là, plus de problème d'ImageIO, et ton maître de stage, il va danser la gigue....

  4. #4
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut
    Je n'ai pas tout compris à ton poste, désolé.
    Je ne vois pas trop où je recharge à chaque fois mon image :/
    Je suis pas encore un expert java, lol

    Quelques precisions peut-être : à chaque appel de ma fonction, l'image fournie est différente. Et cette image redimensionnée est ensuite affichée dans un navigateur internet. (mon image doit être redimensionnée pour être plus légère lors de l'envoi au client).

    Pourrais-tu me donner plus de détails s'il te plait.

  5. #5
    Membre expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Par défaut
    ok, ok, je me suis laissé emporter par le resize (j'avais dans l'idée un redimensionnement dynamique pour un zoom ou un redimensionnement de fenêtre). Si tu ne charges qu'une fois l'image, ça change tout !
    Pour améliorer les performances, je ne sais trop que te conseiller... Mais je sais que j'avais à charger de grosses images et qu'en augmentant la mémoire allouée par la JVM (passer -Xmx256m en argument, avec 256=valeur de la mémoire) et bien leur chargement s'est accéléré, mais aussi celui des petites images... Mais c'est purement empirique, désolé !

  6. #6
    Membre confirmé Avatar de zoullou
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Par défaut
    Est ce que tu a essayé avec ImageIcon ?

  7. #7
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut
    non pas encore, je vais essayer, merci ^^

  8. #8
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut
    zoullou > merci ;-)
    Je gagne déjà pas mal là comme ça en passant par un ImageIcon. Environ 30 % de temps en moins d'après les premières mesures. Faut que je contrôle cela de plus près, mais c'est plus rapide.
    Merci

    dazz_x > je vais me pencher vers "-Xmx256m" aussi pour voir ce qu'il en est. Merci !


    Wouhah ! J'ai eu des réponses pertinentes et rapidement, que demander de mieux ^^

    Encore merci à vous deux !

    (PS si vous voyez autre chose, ne vous génez pas bien entendu )

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Dans la classe Image, tu as une méthode [FONT=monospace]"getScaledInstance[/FONT](int width, int height, int hints)"...


    Ca te facilitera la tâche je pense

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Cette lméthode est à bannir car entièrement software donc très lente par rapport à ce que il utilise en ce moment.
    Pour le redimensionnement sinon fais une recherche dans le forum sur "mip mapping" gfx avait donné dans un post la façon de procéder
    Voila le post en question: http://www.developpez.net/forums/sho...ht=mip+mapping

    Par contre pour le chargement de l'image je ne vois pas d'autre moyen que ImageIO.read() pour procéder....

  11. #11
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par sinok
    Cette lméthode est à bannir car entièrement software donc très lente par rapport à ce que il utilise en ce moment.
    Ah ouais? C bon à savoir.
    Mais comment sais-tu que cette méthode est entièrement software et que dans BufferedImage ça n'est pas entièrement software?

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Réfère toi au lein que j'ai mis dans mon post précédent
    L'info vient de Gfx qui bosse sur Swing pour Sun, ce qui dans l'ensemble apparait comme une source de grande fiabilité

  13. #13
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut
    sinok > merci beaucoup pour l'info, je me coucherai moins bête aussi ^^

    Pour le chargement de l'image, je fais ça actuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image imgOld = new ImageIcon(imgPath).getImage();
    et ça semble plus rapide (JProbe) que de passer par un File puis de faire le ImageIO.read()

    Je vais essayer de regarder le mip mapping.


    Merci encore

Discussions similaires

  1. [FLASH 8] Redimensionner image
    Par arnaud_verlaine dans le forum Flash
    Réponses: 4
    Dernier message: 14/06/2006, 11h43
  2. Optimiser les images JPEG sur serveur
    Par camboui dans le forum Imagerie
    Réponses: 7
    Dernier message: 31/05/2006, 10h08
  3. Redimensionner image avant de la charger
    Par nou366 dans le forum Delphi
    Réponses: 2
    Dernier message: 11/05/2006, 13h05
  4. Redimensionner image dans MDI
    Par DEFITOP dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/05/2006, 20h02
  5. [MFC - GDI] Redimensionnement Image
    Par Ben A. dans le forum MFC
    Réponses: 3
    Dernier message: 02/02/2006, 11h54

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