Dans cette fiche...

<Retour>

Description de l'applet

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.
Démonstration...

Votre navigateur n'est pas compatible Java !

Principe

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 :

  1. On charge une image
  2. On identifie son "producteur" (ImageProducer), qui permet la lecture de l'image
  3. On applique un filtre à l'image
  4. On obtient une image résultante.

Listing de l'applet

// --------------------------------------------------
// 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);
	}
}

Le listing en détail...

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.

Intégration de l'applet dans la page

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.