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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 27
    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 Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    je les ai jamais utilisées, mais as tu essayé les classes AffineTransform (en mode TYPE_UNIFORM_SCALE) et AffineTransformOp ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    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 909
    Billets dans le blog
    54
    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.
    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

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    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 averti
    Inscrit en
    Juin 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 27
    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 confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    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 909
    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 909
    Billets dans le blog
    54
    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.
    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. [winform][dotnet] afficher une portion d'image zoomée
    Par maxdwarf dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/02/2007, 17h13
  2. [D7]image zoomée et modification
    Par dleu dans le forum Delphi
    Réponses: 2
    Dernier message: 17/01/2007, 17h59
  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: 10/01/2006, 23h10
  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, 16h42
  5. [Image] Zoom Dezoom
    Par cyber_jad dans le forum 2D
    Réponses: 5
    Dernier message: 12/11/2004, 14h30

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