Dans cette fiche... |
Difficulté : ![]() ![]() |
Résultat |
Vous aurez parfois besoin
d'extraire des portions d'images, pour en créer de nouvelles (voir par
exemple l'applet KawaPuzzle).
Une façon de le faire est d'utiliser le CropImageFilter. |
Le CropImageFilter est, comme son nom l'indique, un filtre qui découpe les images. Vous lui donnez une image, une zone rectangulaire, et le CropImageFilter produit une nouvelle image.
En Java, un filtre s'applique globalement de la façon suivante :
// -------------------------------------------------- // PORTIONIMAGE // Utilisation du CropImageFilter pour copier une // partie d'image // --------------------------------------------------
import java.applet.*; import java.awt.*; import java.awt.image.*;
public class PortionImage extends Applet { // Images Image im, im1, im2;
// Filtre ImageProducer improd; ImageFilter cif1, cif2;
// -------------------------------------------------- // INITIALISATION DE L'APPLET // --------------------------------------------------
public void init() { // Définir le fond de l'applet en blanc setBackground(Color.white);
// Chargement de l'image im = getImage(getDocumentBase(), "smiley.gif"); improd = im.getSource();
// Créer une nouvelle image avec le coin Nord-Ouest de l'image cif1 = new CropImageFilter(0, 0, 60, 40); im1 = createImage(new FilteredImageSource(improd, cif1));
// Créer une autre image avec l'intérieur de l'image cif2 = new CropImageFilter(40, 40, 80, 40); im2 = createImage(new FilteredImageSource(improd, cif2)); }
// -------------------------------------------------- // AFFICHAGE // --------------------------------------------------
public void paint(Graphics g) { g.drawImage(im, 0, 0, this); g.drawImage(im1, 120, 0, this); g.drawImage(im2, 200, 0, this); } }
Les lignes non commentées ont déjà été traitées dans les exemples précédents.
Image im, im1, im2; |
On déclare 3 objets Image : im pour l'image originale (qui sera chargée sur le serveur), im1 pour une première portion d'image, im2 pour une 2ème portion. |
ImageProducer improd; |
Cet objet ImageProducer reprend les méthodes de production de l'image. Il sera utilisé par le filtre pour créer les portions d'images. |
ImageFilter cif1, cif2; |
On crée 2 objets ImageFilter (un pour chaque portion d'image). |
im = getImage(getDocumentBase(), "smiley.gif"); improd = im.getSource(); |
L'image est chargée par la méthode getImage()
(ça ce n'est pas nouveau). On peut alors aller chercher son "producteur" (ImageProducer) par la méthode getSource() de l'objet Image. |
cif1 = new CropImageFilter(0, 0, 60, 40); |
Le plus intéressant : on crée un filtre d'image, soit une zone rectangulaire partant du coin (0, 0) de l'image d'origine, de largeur 60 pixels, et de hauteur 40 pixels. Ceci correspond donc au coin supérieur gauche de l'image (celle de l'exemple fait approximativement 120 pixels de large par 88 de haut). |
im1 = createImage(new FilteredImageSource(improd, cif1)); |
On crée l'image im1 grâce à
la méthode createImage(). Cette méthode reçoit elle-même un objet FilteredImageSource (qui est le résultat d'un filtre appliqué à une image). Enfin, cette méthode FilteredImageSource reçoit 2 paramètres : le producteur d'image (ImageProducer) qui sert à récupérer l'image, et le filtre qui sert à manipuler l'image. Ouf ! On aurait pu faire plus rapide en écrivant : cif1 = new CropImageFilter(0, 0, 60, 40); im1 = createImage(new FilteredImageSource(im.getSource(), cif1)); |
cif2 = new CropImageFilter(40, 40, 80, 40); im2 = createImage(new FilteredImageSource(improd, cif2)); |
On fait pareil avec une deuxième portion
d'image. Cette fois, la portion part de (x = 40, y = 40), et fait une taille
de (largeur = 80, hauteur = 40), soit grossièrement le centre de l'image.
Il ne reste plus qu'à afficher l'image et les 2 portions qui en sont issues. |
Voici le code qui a été utilisé dans cette page HTML pour faire apparaître l'applet :
<applet code="PortionImage.class" width=250 height=90> Votre navigateur n'est pas compatible Java ! </applet>
Pour plus de précisions sur l'intégration d'une applet, cliquez ici.