Partage
  • Partager sur Facebook
  • Partager sur Twitter

Appli Java: Zoom sur une image

ajouter la possibiliter de zoomer

Sujet résolu
    2 août 2012 à 12:24:08

    Bonjour à tous,

    Je suis en train de tripatouiller un appli java, et j'aurais besoin d'ajouter un zoom sur une image, c'est à dire (dans l'idéal) j'aimerais zoomer sur l'image affichée en maintenant enfoncé la roulette et en deplaçant la souris.
    Et... j'aimerais qu'en maintenant ne plus la touche CTRL faire une translation (naviguer dans l'image) suivant la direction de la souris !! (rien que ça!)
    Le seul soucis, c'est que j'ai absoluement aucune idée de comment on fait !

    C'est là que les expert java interniennent! :-)

    un idée de comment faire ça?

    Merci en tous cas de prendre le temps de lire, bonne journée! :D
    • Partager sur Facebook
    • Partager sur Twitter
      2 août 2012 à 22:22:34

      Salut,

      Ben pour l'image, il faut que tu regardes du coté de l'objet Graphics et Graphics2D et en particulier de la méthode drawImage (qui prend une image ou une BufferedImage)

      Pour ta touche ctrl, c'est un event qu'il faut que tu captures.

      Bref, ce n'es pas quelque chose de trivial


      Cordialement,
      Patouche
      • Partager sur Facebook
      • Partager sur Twitter
        8 août 2012 à 12:47:36

        Salut,

        J'ai résolu le coup de la molette, par contre ce que je n'arrive toujours pas à faire, c'est de faire un scale qui fonctionne sur ma BufferedImage.

        J'ai trouvé moultes solution sur internet, mais je n'arrive à en faire fonctionner aucune, ça compile mais il ne se passe rien.
        Il peut y avoir plusieurs choses, ne sachant pas ou mettre mon scale dans mon code, car l'image peut être rafraichit pour autre chose que pour un zoom, du coup j'ai decidé de rafraichir de toutes façon ma BufferedImage, et aprés, si y'a un scale à faire, je fais ce qui est proposé sur internet, c'est à dire des choses comme:
        BufferedImage theImg_scaled = new BufferedImage((int)(img.getWidth()*scale),(int)( img.getHeight()*scale),BufferedImage.TYPE_INT_ARGB);Graphics2D grph = (Graphics2D) theImg_scaled.getGraphics();
        grph.scale(scale, scale);
        grph.drawImage(theImg_scaled, 0, 0, null);
        

        ou
        BufferedImage theImg_scaled = new BufferedImage((int)(img.getWidth()),(int)(img.getHeight()),BufferedImage.TYPE_INT_ARGB);
        AffineTransform at = new AffineTransform();
        at.scale(this.scale,this.scale);
        AffineTransformOp scaleOp = 
        						   new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
        				theImg_scaled = scaleOp.filter(img, theImg_scaled);
        

        qui ne fait rien du tout.

        Une suggestion??

        Merci et bonne journée,
        Klairek
        • Partager sur Facebook
        • Partager sur Twitter
          8 août 2012 à 13:30:00

          Pourquoi tu ferais pas ton scale juste à l'affichage ?
          T'as des coordonnées de translation obtenues grâce à la position de la souris(ou pas, je sais pas), un facteur de zoom grâce à la molette.
          Après, t'as plus qu'à composer ton AffineTransform, à prendre un Graphics2D(ne pas oublier de faire dispose(); après l'utilisation pour la mémoire, ça fait ça en moins pour le GC)
          Et tu peux passer la transformation en paramètre de g2d.drawImage() ;) .

          Donc en gros, pas besoin d'une image intermédiaire quoi.
          • Partager sur Facebook
          • Partager sur Twitter
            8 août 2012 à 15:08:17

            Salut,

            alors j'ai changer, si il y a un mouvement de molette, ça (devrait) grossir, voilà ce que j'ai fait:
            images.addMouseWheelListener(new MouseWheelListener() {public void mouseWheelMoved(MouseWheelEvent e){
            	if (e.getWheelRotation()<0){ // Rotated Up
            				
            	images.scale=images.scale*2;
            	System.out.println("scale: "+images.scale);
            	BufferedImage imgScal = images.image.img[images.selectedImage];
            	Graphics2D grph = imgScal.createGraphics();
            	grph.scale(images.scale,images.scale);
            	grph.dispose();
            		}
            	else {images.scale=images.scale/2; }
            


            Mais.. ça marche pas! J'ai bien le println qui fonctionne, mais pour la suite, il ne se passe rien.

            Aprés j'ai pas trés bien compris comment composer l'AffineTransform avec le Graphics2D, et le g2d.drawImage() en paramétre! :o J'suis un chouia noob u_u
            Je ne serais pas contre une explication plus poussée! :)

            Merci en tous cas !
            • Partager sur Facebook
            • Partager sur Twitter
              8 août 2012 à 15:27:45

              Bon ça me va plus vite de t'écrire un code que de t'expliquer et c'est explicite aussi donc voilà xD
              import java.awt.Dimension;
              import java.awt.Graphics;
              import java.awt.Graphics2D;
              import java.awt.event.MouseWheelEvent;
              import java.awt.event.MouseWheelListener;
              import java.awt.geom.AffineTransform;
              import java.awt.image.BufferedImage;
              import java.io.IOException;
              import java.io.InputStream;
              
              import javax.imageio.ImageIO;
              import javax.swing.JComponent;
              import javax.swing.JFrame;
              
              
              public class ZoomMolette extends JComponent implements MouseWheelListener  {
              	private static final long serialVersionUID = 1L;
              	public int width, height;
              	public BufferedImage img;
              	public float zoom = 1f;
              	
              	public ZoomMolette(int width, int height, InputStream is) {
              		this.width = width;
              		this.height = height;
              		setPreferredSize(new Dimension(width, height));
              		try {
              			img = ImageIO.read(is);
              		} catch (IOException e) { e.printStackTrace(); }
              		addMouseWheelListener(this);
              	}
              	
              	@Override
              	protected void paintComponent(Graphics gd) {
              		Graphics2D g = (Graphics2D) gd;
              		
              		AffineTransform t = new AffineTransform();
              		//Ici je centre l'image
              		float currentImgWidth = img.getWidth()*zoom, currentImgHeight = img.getHeight()*zoom;
              		t.translate(width/2-currentImgWidth/2, height/2-currentImgHeight/2);
              		//J'applique le "scale"
              		t.scale(zoom, zoom);
              		//Et j'affiche en utilisant la transformation
              		g.drawImage(img, t, null);
              		
              		//On libère un peu de mémoire histoire de laisser le GC tranquille un peu plus longtemps
              		g.dispose();
              	}
              
              	public void mouseWheelMoved(MouseWheelEvent e) {
              		zoom -= 0.1f * e.getWheelRotation();
              		repaint();
              	}
              	
              	//On s'en fout, je crée juste ma fenêtre...
              	public static void main(String[] args) {
              		ZoomMolette m = new ZoomMolette(640, 480, ZoomMolette.class.getResourceAsStream("/zoom.png"));
              		
              		JFrame f = new JFrame();
              		f.setResizable(false);
              		f.add(m);
              		f.pack();
              		f.setLocationRelativeTo(null);
              		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              		
              		f.setVisible(true);
              	}
              }
              


              Et maintenant même les commentaires!
              Une belle langue le Java je trouve :) .

              Merde, j'ai changé un truc avec les commentaires et ça foire xD
              Awi, c'est bon... 10 minutes plus tard xD
              • Partager sur Facebook
              • Partager sur Twitter
                8 août 2012 à 15:54:27

                Whaaa! C'est fou ça! Ca marche! :o

                Merci beaucoup!! :D En plus j'ai même compris comment ça marche, c'est fou! ^^
                • Partager sur Facebook
                • Partager sur Twitter
                  8 août 2012 à 16:14:50

                  Bah oui que ça fonctionne :-° . Et de rien.
                  Après, rien ne t'empêche de moduler le facteur de zoom hein, tu fais comme tu veux (élever au carré et empêcher de passer sous 0 par exemple).
                  J'imagine d'ailleurs que tu l'as fait, ça rend mieux quand même au niveau effet xD .

                  import java.awt.Dimension;
                  import java.awt.Graphics;
                  import java.awt.Graphics2D;
                  import java.awt.event.MouseWheelEvent;
                  import java.awt.event.MouseWheelListener;
                  import java.awt.geom.AffineTransform;
                  import java.awt.image.BufferedImage;
                  import java.io.IOException;
                  import java.io.InputStream;
                  
                  import javax.imageio.ImageIO;
                  import javax.swing.JComponent;
                  import javax.swing.JFrame;
                  
                  
                  public class ZoomMolette extends JComponent implements MouseWheelListener  {
                  	private static final long serialVersionUID = 1L;
                  	public int width, height;
                  	public BufferedImage img;
                  	public float zoom = 1f;
                  	
                  	public ZoomMolette(int width, int height, InputStream is) {
                  		this.width = width;
                  		this.height = height;
                  		setPreferredSize(new Dimension(width, height));
                  		try {
                  			img = ImageIO.read(is);
                  		} catch (IOException e) { e.printStackTrace(); }
                  		addMouseWheelListener(this);
                  	}
                  	
                  	@Override
                  	protected void paintComponent(Graphics gd) {
                  		Graphics2D g = (Graphics2D) gd;
                  		
                  		float z = zoom*zoom;
                  		
                  		AffineTransform t = new AffineTransform();
                  		//Ici je centre l'image
                  		float currentImgWidth = img.getWidth()*z, currentImgHeight = img.getHeight()*z;
                  		t.translate(width/2-currentImgWidth/2, height/2-currentImgHeight/2);
                  		//J'applique le "scale"
                  		t.scale(z, z);
                  		//Et j'affiche en utilisant la transformation
                  		g.drawImage(img, t, null);
                  		
                  		//On libère un peu de mémoire histoire de laisser le GC tranquille un peu plus longtemps
                  		g.dispose();
                  	}
                  
                  	public void mouseWheelMoved(MouseWheelEvent e) {
                  		zoom = Math.max(0, zoom - 0.03f * e.getWheelRotation());
                  		repaint();
                  	}
                  	
                  	//On s'en fout, je crée juste ma fenêtre...
                  	public static void main(String[] args) {
                  		ZoomMolette m = new ZoomMolette(640, 480, ZoomMolette.class.getResourceAsStream("/zoom.png"));
                  		
                  		JFrame f = new JFrame();
                  		f.setResizable(false);
                  		f.add(m);
                  		f.pack();
                  		f.setLocationRelativeTo(null);
                  		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  		
                  		f.setVisible(true);
                  	}
                  }
                  
                  (perso mon image est en 1920*2160, j'espère que ça donne bien avec les petites aussi xD .)

                  Ravi d'avoir pu t'aider.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 avril 2016 à 4:09:58

                    coMment faire agrandir un  bouton en déplaçant la souris dans un site web ?
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Appli Java: Zoom sur une image

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown