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

2D Java Discussion :

[Image] zoom et redimensionnement


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 27
    Points : 23
    Points
    23
    Par défaut [Image] zoom et redimensionnement
    Bonjour,

    j'ai chercher dans la faq et j'ai trouver comment redimentionner une image mais ce que je voudrais faire c'est un zoom je veux voir distinctement les pixel de l'image de base.
    voilas ce que j'ai fait mais c'est un peu bourrin et surtout si je zoom trop => out of memorie.
    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
     
        private JLabel lImage;
        private JPanel pImage;
        private BufferedImage image;
        private double coef = 1;
     
        public void mouseWheelMoved(MouseWheelEvent e) {
            int rot = e.getWheelRotation();
            LogFile.addMessage("mouseWheelMoved : rot=" + rot);
            if (rot > 0)
                coef = coef * 0.5;
            else
                coef = coef * 2;
     
            pImage.removeAll();
            Image img = zoom(image, coef);
            lImage = new JLabel(new ImageIcon(Toolkit.getDefaultToolkit().createImage(img.getSource())));
            //pImage.add(new JLabel(new ImageIcon(img)), BorderLayout.CENTER);
            pImage.add(lImage, BorderLayout.CENTER);
            pImage.revalidate();
        }
        private BufferedImage zoom(BufferedImage bi, double zoomValue){
             // Test des parametre : 
             if (bi == null) return null;         
             //if (zoomValue > 0 && zoomValue != (int)zoomValue)return null;
             BufferedImage biNew = new BufferedImage( (int) (bi.getWidth() * zoomValue),
                     (int) (bi.getHeight() * zoomValue),
                     bi.getType());
             for (int it = 0 ; it <  biNew.getWidth(); it++){
                 for (int jt = 0 ; jt <  biNew.getHeight(); jt++){
                     biNew.setRGB(it, jt, bi.getRGB((int)(it / zoomValue), (int)(jt / zoomValue) ));                 
                 }             
             }
             return biNew;
         }
    avez vous une meilleur idée?
    merci de votre aide.

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bonjour,

    je les ai jamais utilisées, mais as tu essayé les classes AffineTransform (en mode TYPE_UNIFORM_SCALE) et AffineTransformOp ?

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 876
    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 876
    Points : 22 939
    Points
    22 939
    Billets dans le blog
    53
    Par défaut
    En fait tu n'as pas vraiment besoin de créer une nouvelle image zoomée à partir de la première. Il te suffit de surcharger la méthode drawComponent() de ton composant (en général on utilise un panel plutot qu'un label) et d'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    graphics.drawImage(srcImg, 0, 0, (int)(srcImg.getWidth() * zoomFactor), (int)(srcImg.getHeight() * zoomFactor), null);
    Ou une transformation affine genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    AffineTransform t = AffineTransforme.getScaleInstance(zoomFactor, zoomFactor);
    graphics.setTransform(t);
    graphics.drawImlage(srcImage, 0, 0, null);
    graphics.setTransform(t.createInverse());
    Cette dernière solution permettant d'utiliser des valeurs de zoom flottantes.

    Penser également à mettre correctement la mininumSize/preferredSize du composant en fonction de la taille de l'image et du facteur de zoom.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    J'ai récemment ajouté un composant ZoomableImagePanel au projet SwingLabs. Toutes les explications sont ici : http://weblogs.java.net/blog/gfx/archive/2005/09/zoom_pictures_w.html

    Si tu lances la démo, décoche l'option "Drop shadow" pour avoir les performances réelles du zoom (le calcul de l'ombre n'est pas optimisé et prend beaucoup de temps quand tu zoomes beaucoup). Le code est sous licence libre tu peux donc y jeter un oeil ou réutiliser le composant, il n'y a aucun problème.

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    le principe de surcharge me plai bien mais j'ai pas trouver la methode drawComponent()
    j'ai touver paintComponents
    mais ca fonctionne pas

    as tu un exemple de la surcharge a me montrer ?

    merci

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    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
     
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
     
            if (image != null) {
                int image_x = (getWidth() - cachedWidth) / 2;
                int image_y = (getHeight() - cachedHeight) / 2;
     
                Graphics2D g2 = (Graphics2D) g;
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                g.drawImage(image, image_x, image_y, cachedWidth, cachedHeight, this);
            }
        }

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 876
    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 876
    Points : 22 939
    Points
    22 939
    Billets dans le blog
    53
    Par défaut
    mais j'ai pas trouver la methode drawComponent()
    Desole, faute de frappe... c'est bien paintComponent comme l'a indique le code de Gfx.

Discussions similaires

  1. [winform][dotnet] afficher une portion d'image zoomée
    Par maxdwarf dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/02/2007, 18h13
  2. [D7]image zoomée et modification
    Par dleu dans le forum Delphi
    Réponses: 2
    Dernier message: 17/01/2007, 18h59
  3. Un image qui se redimensionne dynamiquement sur toute la cel
    Par Furius dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 11/01/2006, 00h10
  4. [JScrollPane] Zoom et redimensionnement du JScrollPane
    Par Bideul dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 30/06/2005, 17h42
  5. [Image] Zoom Dezoom
    Par cyber_jad dans le forum 2D
    Réponses: 5
    Dernier message: 12/11/2004, 15h30

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