Afficher des images avec Java

Aller en bas

Afficher des images avec Java Empty Afficher des images avec Java

Message  Gus le Sam 23 Juil - 11:01

Une fois qu'on a réussi à lire un fichier d'image, notre première intention est généralement d'afficher cette image dans l'interface graphique de notre application Java. Il n'existe pas à ma connaissance de composant Swing tout prêt dans l'API de base pour réaliser cette fonction.

Dans l'API JAI (Advanced Java Imaging) il existe bien une classe DisplayJAI qui hérite de JPanel mais un petit tour rapide sur sa javadoc me fait penser qu'elle ne permet que l'affiche en taille réelle. Il faudra que je pense à la tester un jour.

Quoiqu'il en soit, on peut très bien afficher des images avec l'API de base. Il suffit pour cela de créer sa propre classe ScreenJPanel en héritant de JPanel et en surchargeant la méthode paintComponent(Graphics g)

La où les choses se compliquent, c'est qu'il existe potentiellement deux types différents pour les images : la classe abstraite java.awt.Image dont l'implémentation la plus classique est java.awt.image.BufferedImage et puis java.awt.image.RenderedImage dont l'implémentation la plus classique se trouve aussi être BufferedImage...

J'avais d'abord crée une entité pour afficher les objets de type Image :
gus.graphic.panel.screen.image

J'ai ensuite crée une entité pour afficher les objets de type RendredImage :
gus.graphic.panel.screen.image2

Avant de finalement concevoir une troisième entité qui affiche des objets pouvant être soit de type Image, soit de type RenderedImage. C'est cette entité que je vais vous présenter :
gus.graphic.panel.screen.image3

Dans mes entités d'affichage d'image, je prend en compte trois modes d'affichage différents :

  1. Affichage ajusté: Le mode d'affichage par défaut est le mode "affichage ajusté" qui permet d'ajuster la taille de l'image pour la faire tenir dans le composant d'affichage sans la déformer (des bandes vides apparaissent sur les cotés haut/bas ou droite/gauche).
    Afficher des images avec Java Affichage_mode_ajuste

  2. Affichage déformé: Dans ce mode, l'image prend la taille exacte du composant et se trouve donc déformée (son ratio hauteur/largeur change).
    Afficher des images avec Java Affichage_mode_deforme

  3. Affichage en taille réelle: Dans ce troisième mode, c'est le composant qui prend la taille réelle de l'image (il est alors nécessaire de mettre ce composant dans un JScrollPane pour pouvoir visualiser toute l'image).
    Afficher des images avec Java Affichage_mode_taillereelle

Le code source de l'entité gus.graphic.panel.screen.image3 contient deux classes que voici :

Code:
package gus05.entity.gus.graphic.panel.screen.image3;

import javax.swing.JComponent;
import gus05.framework.core.Entity;
import gus05.framework.features.Give;
import gus05.framework.features.Graphic;
import gus05.framework.features.Register;
import gus05.framework.features.Retrieve;

public class ImageScreen3 implements Entity, Give, Register, Retrieve, Graphic {

    public String getName()            {return "gus.graphic.panel.screen.image3";}
    public String getCreationDate()      {return "2011.07.20";}

    private ScreenJPanel screen;
   
    public ImageScreen3()
    {screen = new ScreenJPanel();}
   
    public JComponent gui()
    {return screen;}
   
    public void give(Object obj) throws Exception
    {screen.setImage(obj);}

    public void register(String key, Object obj) throws Exception
    {
      if(key.equals("mode")) {screen.setMode((String)obj);return;}
      
      throw new Exception("Unknown key : "+key);
   }
   
    public Object retrieve(String key) throws Exception
   {
      if(key.equals("image")) return screen.getImage();
      if(key.equals("mode")) return screen.getMode();
      if(key.equals("key")) return new String[]{"image","mode"};
      
      throw new Exception("Unknown key : "+key);
   }
}

Code:
package gus05.entity.gus.graphic.panel.screen.image3;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.geom.AffineTransform;
import java.awt.image.RenderedImage;
import javax.swing.JPanel;

public class ScreenJPanel extends JPanel {

   public static String NORMAL_MODE = "normal";
   public static String ADJUSTED_MODE = "adjusted";
   public static String DISTORTED_MODE = "distorted";

   private Object obj;
   private String mode;
   
   public ScreenJPanel()
   {mode = ADJUSTED_MODE;}
   
   public Object getImage()
   {return obj;}

   public String getMode()
   {return mode;}
   
   public void setImage(Object obj)
   {
        this.obj = obj;
        refreshPreferredSize();
      repaint();
    }

   public void setMode(String mode)
   {
      this.mode = mode;
      refreshPreferredSize();
      repaint();
   }
   
   public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
        if(obj==null)return;
       
        if(obj instanceof RenderedImage)
           paintRenderedImage((Graphics2D)g,(RenderedImage)obj);
        else if(obj instanceof Image)
           paintImage((Graphics2D)g,(Image)obj);
    }
   
   private void paintRenderedImage(Graphics2D g2, RenderedImage image)
   {
      int imageW = image.getWidth();
      int imageH = image.getHeight();
      if(imageH<=0) return;
      
      Insets ins = getInsets();
      
      if(mode.equals(NORMAL_MODE))
      {
           AffineTransform af = AffineTransform.getTranslateInstance(ins.left,ins.top);
           g2.drawRenderedImage(image,af);
        }
        else if(mode.equals(DISTORTED_MODE))
        {
           double cx = (double)(getWidth()-ins.left-ins.right)/(double)imageW;
          double cy = (double)(getHeight()-ins.bottom-ins.top)/(double)imageH;
          AffineTransform af = AffineTransform.getTranslateInstance(ins.left,ins.top);
          af.scale(cx,cy);
           g2.drawRenderedImage(image,af);
           
        }   
        else if(mode.equals(ADJUSTED_MODE))
      {
           double cx = (double)(getWidth()-ins.left-ins.right)/(double)imageW;
          double cy = (double)(getHeight()-ins.bottom-ins.top)/(double)imageH;
          
          if(cx>=cy)
          {
             int a = (int)((getWidth()-ins.left-ins.right-imageW*cy)/2);
             AffineTransform af = AffineTransform.getTranslateInstance(a+ins.left,ins.top);
               af.scale(cy,cy);
               g2.drawRenderedImage(image,af);
          }
          else
          {
             int a = (int)((getHeight()-ins.bottom-ins.top-imageH*cx)/2);      
             AffineTransform af = AffineTransform.getTranslateInstance(ins.left,a+ins.top);
             af.scale(cx,cx);
               g2.drawRenderedImage(image,af);
          }
      }
   }
   
   private void paintImage(Graphics2D g2, Image image)
   {
      int imageW = image.getWidth(null);
      int imageH = image.getHeight(null);
      if(imageH<=0) return;
      
      Insets ins = getInsets();
      
      if(mode.equals(NORMAL_MODE))
      {
         g2.drawImage(image,ins.left,ins.top,imageW,imageH,this);
      }
      else if(mode.equals(DISTORTED_MODE))
      {
         int dx = getWidth()-ins.left-ins.right;
         int dy = getHeight()-ins.bottom-ins.top;
         g2.drawImage(image,ins.left,ins.top,dx,dy,this);
      }
      else if(mode.equals(ADJUSTED_MODE))
      {
         double cx = (double)(getWidth()-ins.left-ins.right)/(double)imageW;
          double cy = (double)(getHeight()-ins.bottom-ins.top)/(double)imageH;

         if(cx>=cy)
         {
            int a = (int)((getWidth()-ins.left-ins.right-imageW*cy)/2);
            int dx = (int)(imageW*cy);
            int dy = getHeight()-ins.bottom-ins.top;
            g2.drawImage(image,a+ins.left,ins.top,dx,dy,this);
         }
         else
         {
            int a = (int)((getHeight()-ins.bottom-ins.top-imageH*cx)/2);   
            int dx = getWidth()-ins.left-ins.right;
            int dy = (int)(imageH*cx);
            g2.drawImage(image,ins.left,a+ins.top,dx,dy,this);
         }
      }
   }

   private void refreshPreferredSize()
   {
      if(!mode.equals(NORMAL_MODE)) return;
      if(obj==null) return;
      Insets ins = getInsets();
      
      if(obj instanceof RenderedImage)
      {
         RenderedImage im = (RenderedImage) obj;
         Dimension dim = new Dimension(im.getWidth()+ins.left+ins.right,im.getHeight()+ins.top+ins.bottom);
         setPreferredSize(dim);
         setSize(getPreferredSize());
      }
      else if(obj instanceof Image)
      {
         Image im = (Image) obj;
         Dimension dim = new Dimension(im.getWidth(null)+ins.left+ins.right,im.getHeight(null)+ins.top+ins.bottom);
         setPreferredSize(dim);
         setSize(getPreferredSize());
      }
   }
}
Gus
Gus
Admin

Messages : 249
Date d'inscription : 01/09/2009

Voir le profil de l'utilisateur http://www.gus05.com

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum