Java AWT Images o Lire une image o

  • Slides: 32
Download presentation
Java AWT Images o Lire une image o Images d’icones o Afficher une image

Java AWT Images o Lire une image o Images d’icones o Afficher une image o Création d’images tampon o Traitement d’images Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 1

Lire une image n Java AWT Lecture simple dans un fichier String nom =

Lire une image n Java AWT Lecture simple dans un fichier String nom = “bleu. gif”; Image image; image Toolkit. get. Default. Toolkit(). get. Image(nom); n Lecture sur Internet URL u = new URL(“http: //www. quelquepart. com/image. jpg”); Image image = Toolkit. get. Default. Toolkit(). get. Image(u); n Dessin de l’image, à l’aide d’un contexte graphique, dans un composant graphics. draw. Image(image, 0, 0, null); Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 2

Attendre l’image Java AWT n La requête get. Image() est enregistrée, mais son exécution

Attendre l’image Java AWT n La requête get. Image() est enregistrée, mais son exécution est retardée. n Le chargement de l’image a lieu au premier appel de draw. Image(), mais l l le chargement est pris en main par un nouveau thread, en asynchrone l’exécution du programme continue sans attendre la fin du chargement. n L’affichage peut donc être progressif. n Pour attendre la fin du chargement, on utilise un “pisteur” de la classe Media. Tracker. Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 3

Pister le chargement n Java AWT Les images à pister sont ajoutées au pisteur,

Pister le chargement n Java AWT Les images à pister sont ajoutées au pisteur, chacune avec un numéro d’identification Media. Tracker tracker = new Media. Tracker(this); Image image = Toolkit. get. Default. Toolkit(). get. Image(nom); tracker. add. Image(image, 0); l’argument est le composant dans lequel l’image sera affichée n On attend la fin du chargement d’une image par try { tracker. wait. For. ID(0); } catch (Interrupt. Exception exc) {} ou de toutes les images pistées plus simplement par try { tracker. wait. For. All(); } catch (Interrupt. Exception exc) {} Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 4

Exemple Java AWT class Image. Panel extends JPanel { private Image image; public Image.

Exemple Java AWT class Image. Panel extends JPanel { private Image image; public Image. Panel() { image = Toolkit. get. Default. Toolkit(). get. Image("tiger. gif”); Media. Tracker tracker = new Media. Tracker(this); tracker. add. Image(image, 0); try { tracker. wait. For. All(); } catch (Interrupted. Exception e) {} } public void paint. Component(Graphics g) { super. paint. Component(g); int width = get. Size(). width; int height = get. Size(). height; int image. Width = image. get. Width(this); int image. Height = image. get. Height(this); g. draw. Image(image, 0, 0, this); for (int w = 0; w < width; w += image. Width) for (int h = 0; h < height; h += image. Height) if (w + h > 0) g. copy. Area(0, 0, image. Width, image. Height, w, h); } } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 5

Java AWT Icones n La classe javax. swing. Image. Icon est une implémentation de

Java AWT Icones n La classe javax. swing. Image. Icon est une implémentation de l’interface javax. swing. Icon. n Les constructeurs public Image. Icon(String nom. Fichier) public Image. Icon(URL url) public Image. Icon(byte[] donnees. Image) attendent que l’image soit chargée avant de retourner. n La méthode get. Image() retourne l’image représentée par l’objet. n Ainsi, le chargement d’une image s’écrit simplement Image image = new Image. Icon("tiger. gif"). get. Image(); Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 6

Afficher une image n Java AWT Il y a 6 versions de draw. Image

Afficher une image n Java AWT Il y a 6 versions de draw. Image public boolean draw. Image(Image img, int x, int y, Image. Observer observer) l affiche l’image à l’endroit indiqué public boolean draw. Image(Image img, int x, int y, Color bgcolor, Image. Observer observer) l les parties transparentes sont rendues dans la couleur de fond public boolean draw. Image(Image img, int x, int y, int width, int height, Image. Observer observer) l l’image est déformée pour remplir le rectangle donné. Variante avec couleur de fond public boolean draw. Image(Image img, int dx 1, int dy 1, int dx 2, dy 2, int sx 1, int sy 1, int sx 2, int sy 2, Image. Observer observer) l la partie de l’image délimitée par le rectangle donné par les points d 1 et d 2 est affichée dans le rectangle donné par les points s 1 et s 2. Une déformation peut avoir lieu. Variante avec couleur de fond Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 7

Manipulation d’images n Un objet de la classe Image n’est pas modifiable. n La

Manipulation d’images n Un objet de la classe Image n’est pas modifiable. n La classe java. awt. image. Buffered. Image permet cet accès. C’est une classe dérivée de la classe Image. n C’est une situation semblable à String et String. Buffer n Une image tampon est un tableau rectangulaire de pixels. l l Java AWT A chaque pixel est associé la couleur d’un point, dans une parmi plusieurs formes possibles appelées valeurs d’échantillonage. Ces valeurs sont interprétées selon le modèle de couleur de l’image. Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 8

Créer une image tampon n Java AWT Création d’une image vide Buffered. Image(int width,

Créer une image tampon n Java AWT Création d’une image vide Buffered. Image(int width, int height, int type. Image) n Les types d’images indiquent comment les couleurs des pixels sont codées. TYPE_3 BYTE_BGR TYPE_4 BYTE_ABGR_PRE TYPE_BYTE_BINARY TYPE_BYTE_INDEXED TYPE_BYTE_GRAY TYPE_USHORT_555_RGB TYPE_USHORT_565_RGB TYPE_USHORT_GRAY TYPE_INT_RGB TYPE_INT_BGR TYPE_INT_ARGB_PRE bleu, vert, rouge, sur 8 bits chacun alpha, bleu, vert, rouge, sur 8 bits chacun, les couleurs pondérées 1 bit par pixel, groupés en octets 1 octet par pixel, indice dans une table de couleurs 1 octet par pixel, niveau de gris rouge, vert, bleu, sur 5 bits, codés dans un short rouge sur 5, vert sur 6, bleu sur 5 bits niveau de gris sur 16 bits rouge, vert, bleu sur 8 bits chacun, dans un int bleu, vert, rouge (Solaris) alpha, rouge, vert, bleu sur 8 bits, dans un int les couleurs déjà pondérées par alpha Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 9

Création d’une image n Exemple standard : création d’une image (vide) tampon Java AWT

Création d’une image n Exemple standard : création d’une image (vide) tampon Java AWT Buffered. Image image = new Buffered. Image(500, 400, Buffered. Image. TYPE_INT_RGB); n On accède aux pixels par une objet Writable. Raster, par Writable. Raster raster = image. get. Raster(); n On fixe la valeur d’un pixel par set. Pixel(), mais en donnant la couleur dans le type de l’image. l Dans le type TYPE_INT_ARGB, on fournit un tableau de 4 entiers entre 0 et 255, pour les composantes alpha, rouge, vert, bleu: int[] bleu = { 0, 0, 0, 255}; raster. set. Pixel(i, j , bleu); Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 10

Création d’une image n Le type de l’image est encapsulé dans le modèle de

Création d’une image n Le type de l’image est encapsulé dans le modèle de couleur tampon n Java AWT La méthode get. Data. Elements() du modèle fait la conversion, et la méthode set. Data. Elements() du raster équivaut à set. Pixel() l Obtention du modèle Color. Model model = image. get. Color. Model(); l Transformation de couleur en valeurs d’échantillonage Color couleur = new Color(0. 0 f, 1. 0 f); int argb = couleur. get. RGB(); Object donnee = model. get. Data. Elements(argb, null); l Affectation des valeurs d’échantillonage raster. set. Data. Elements(i, j, donnee); Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 11

Création d’une image tampon n Java AWT Création à partir d’une image de type

Création d’une image tampon n Java AWT Création à partir d’une image de type Image static Buffered. Image make. Buffered. Image(Image image, int image. Type) { Buffered. Image buffered. Image; buffered. Image = new Buffered. Image( image. get. Width(null), image. get. Height(null), image. Type); Graphics 2 D g 2 = buffered. Image. create. Graphics(); g 2. draw. Image(image, null); return buffered. Image; } create. Graphics est comme get. Graphics Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 12

Exemple Mandelbrot n Java AWT Le panneau contenant l’image class Mandelbrot. Panel extends JPanel

Exemple Mandelbrot n Java AWT Le panneau contenant l’image class Mandelbrot. Panel extends JPanel { public void paint. Component(Graphics g) { super. paint. Component(g); set. Background(Color. green); Buffered. Image image = new Buffered. Image(get. Width(), get. Height(), Buffered. Image. TYPE_INT_ARGB); generer(image); g. draw. Image(image, 0, 0, null); } public void generer(Buffered. Image image) {. . . } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 13

Exemple Mandelbrot (suite) n Java AWT La fonction generer détermine les points de la

Exemple Mandelbrot (suite) n Java AWT La fonction generer détermine les points de la fractale et les ajoute à l’image. class Mandelbrot. Panel { public void generer(Buffered. Image image) { int width = image. get. Width(); int height = image. get. Height(); Writable. Raster raster = image. get. Raster(); Color. Model model = image. get. Color. Model(); Color fractal. Color = Color. red; int argb = fractal. Color. get. RGB(); Object color. Data = model. get. Data. Elements(argb, null); for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) { double a = XMIN + i * (XMAX - XMIN) / width; double b = YMIN + j * (YMAX - YMIN) / height; if (converge(a, b)) raster. set. Data. Elements(i, j, color. Data); } }. . . } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 14

Exemple Mandelbrot (fin) n Java AWT L’aspect algorithmique est couvert par la fonction converge()

Exemple Mandelbrot (fin) n Java AWT L’aspect algorithmique est couvert par la fonction converge() class Mandelbrot. Panel {. . . Mandelbrot. Panel { class private boolean converge(double a, image) double{b) { public void generer(Buffered. Image double xnew, x = 0. 0; int width = image. get. Width(); double ynew, y = 0. 0; int height = image. get. Height(); int iters = 0; raster = image. get. Raster(); Writable. Raster for (int iters = = 0; image. get. Color. Model(); iters < MAX_ITERATIONS; iters++) { Color. Model model xnew = x * x - y * y + a; ynew = 2 * x * y=+Color. red; b; Color fractal. Color = xnew; intxargb = fractal. Color. get. RGB(); y = ynew; Object color. Data = model. get. Data. Elements(argb, null); if (x > 2 || y > 2) return false; } for (int i = 0; i < width; i++) return for true; (int j = 0; j < height; j++) { } double a = XMIN + i * (XMAX - XMIN) / width; double b = YMIN + j * (YMAX - YMIN) / height; private static final double if (converge(a, b))XMIN = -2; private static final double XMAX = 2; j, color. Data); raster. set. Data. Elements(i, private } static final double YMIN = -2; private static final double YMAX = 2; } private static final int MAX_ITERATIONS = 16; . . . } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 15

Structure d’une Buffered. Image Java AWT Une Buffered. Image est composée l d’un Color.

Structure d’une Buffered. Image Java AWT Une Buffered. Image est composée l d’un Color. Model qui définit la façon d’interpréter les couleurs l d’un Writable. Raster, donc d’un raster autorisé en écriture. n Un Raster est composé l d’un Data. Buffer contenant les données brutes, dans un tableau l d’un Sample. Model (modèle d’échantillonage) qui interprète les données n brutes. n On obtient le modèle et le raster par les méthodes get. Writable. Raster raster = image. get. Raster(); Color. Model model = image. get. Color. Model(); Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 16

Traitement d’im ages n Java propose des opérations de traitement d’images (filtres). n L’interface

Traitement d’im ages n Java propose des opérations de traitement d’images (filtres). n L’interface est Buffered. Image. Op. Appliquer une opération est le filtrage. Java AWT Buffered. Image. Op operation =. . . ; Buffered. Image image. Filtree = operation. filter(image); n Il existe cinq classes qui implémentent Buffered. Image. Op: Affine. Transform. Op Rescale. Op Look. Up. Op Color. Convert. Op Convolve. Op Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 17

Convolutions n Les plus spectaculaires sont le lissage (blur) et la détection de contour

Convolutions n Les plus spectaculaires sont le lissage (blur) et la détection de contour n Une convolution calcule la valeur pour chaque pixel en pondérant les couleurs des 9 pixels de son entourage. n Pour le flou, les 9 pixels ont même poids. n Pour la détection de contour, les voisins ont poids nul ou négatif. n Les valeurs sont données dans un vecteur de flottant appelé noyau. Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée Java AWT 18

Java AWT Noyaux des convolutions n Pour le lissage : float[] blur = {1

Java AWT Noyaux des convolutions n Pour le lissage : float[] blur = {1 f/9 f, 1 f/9 f, 1 f/9 f}; Kernel kernel = new Kernel(3, 3, blur); Convolve. Op op = new Convolve. Op(kernel); Buffered. Image image. Filtree = op. filter(image); n Pour la détection des contours: float[] contour = { 0 f, -1 f, 4 f, -1 f, 0 f}; Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée n Pour l’accentuation des couleurs: float[] sharpen = { 0 f, -1 f, 5 f, -1 f, 0 f}; 19

fabriquer les convolutions n Java AWT On les fabrique dans une classe de fabrication:

fabriquer les convolutions n Java AWT On les fabrique dans une classe de fabrication: class Convolution. Fabrique { public static Convolve. Op create. Lisseur() { float[] blur = { 1 f/9 f, 1 f/9 f, 1 f/9 f }; return new Convolve. Op(new Kernel(3, 3, blur), Convolve. Op. EDGE_NO_OP, null); } public static Convolve. Op create. Aiguiseur() { float[] sharp = { 0 f, -1 f, 5 f, -1 f, 0 f }; return new Convolve. Op(new Kernel(3, 3, sharp)); } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 20

constructeurs d’une convolution n Une convolution est définie par un noyau, et l l

constructeurs d’une convolution n Une convolution est définie par un noyau, et l l n Java AWT un comportement sur les bords éventuellement des indications sur le rendu (Rendering. Hints) Deux constructeurs : Convolve. Op(Kernel kernel) Convolve. Op(Kernel kernel, int edge. Condition, Rendering. Hints hints) n les conditions au bords sont : EDGE_NO_OP les pixels aux bords sont copiés sans modification EDGE_ZERO_FILL les pixels aux bords sont traités comme s’ils étaient entourés de zéros (défaut). n Exemples: op = Convolve. Op(new Kernel(3, 3, blur), Convolve. Op. EDGE_NO_OP, null); op = Convolve. Op(new Kernel(3, 3, sharp)); Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 21

Java AWT rescale n Les opérations de “rescaling” modifient les intensités des composantes RGB

Java AWT rescale n Les opérations de “rescaling” modifient les intensités des composantes RGB par deux paramètres : l l un facteur multiplication m un décalage d n La nouvelle intensité est i’ = i * m + d n Ainsi, l l l n si m < 1, l’image est assombrie si m > 1, l’image est plus brillante d est compris entre 0 et 256 et ajoute un éclairement supplémentaire Exemples: op op = = new new Rescale. Op(. 5 f, 0, null) Rescale. Op(. 5 f, 64, null) Rescale. Op(1. 2 f, 0, null) Rescale. Op(1. 5 f, 0, null) Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée plus sombre avec décalage plus brillant encore plus brillant 22

Exemple n Java AWT plus sombre Rescale. Op(. 5 f, 0, null) n plus

Exemple n Java AWT plus sombre Rescale. Op(. 5 f, 0, null) n plus brillant Rescale. Op(1. 5 f, 0, null) Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 23

Java AWT Rotations n Après rotation, une grille de points doit être affichée dans

Java AWT Rotations n Après rotation, une grille de points doit être affichée dans une autre grille. Quelle est la couleur d’un pixel ? n Deux algorithmes proposés en Java: l l nearest neighbor : la couleur est celle du pixel le plus proche bilinear interpolation : la couleur est une combinaison des couleurs des quatre pixels source couvrant le pixel cible. Nearest neighbor Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée Bilinear interpolation 24

Opérations n Une rotation est une transformation affine n par défaut, c’est le calcul

Opérations n Une rotation est une transformation affine n par défaut, c’est le calcul au plus proche voisin n le calcul bilinéaire est spécifié dans les Rendering. Hints Java AWT Affine. Transform at = Affine. Transform. get. Rotate. Instance(Math. PI / 6); Rendering. Hints rh = new Rendering. Hints( Rendering. Hints. KEY_INTERPOLATION, Rendering. Hints. VALUE_INTERPOLATION_BILINEAR); Buffered. Image. Op op = new Affine. Transform. Op(at, rh)); Buffered. Image. Op op = new Affine. Transform. Op(at, null)); Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 25

Manipulation directe par “Lookup” n Java AWT Une opération de “Lookup” remplace les intensités

Manipulation directe par “Lookup” n Java AWT Une opération de “Lookup” remplace les intensités de couleurs par inspection (lookup) dans des tables. Lookup. Table table = new Short. Lookup. Table(0, rouge); Buffered. Image. Op op = new Lookup. Op(table, null); n Les tables d’inspections peuvent être de type Byte. Lookup. Table ou Short. Lookup. Table n Dans les constructeurs, l l le premier argument est un décalage dans la table, le deuxième un tableau (d’entiers courts ou d’octets) à une ou deux dimensions. u une dimension : les mêmes changements pour les trois couleurs u deux dimensions : chaque composante RGB modifiée de façon indépendante Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 26

Exemples n Java AWT Inverser les intensités de toutes les couleurs short[] inverser =

Exemples n Java AWT Inverser les intensités de toutes les couleurs short[] inverser = new short[256]; for (int i = 0; i < 256; i++) inverser[i] = (short)(255 - i); Lookup. Table table = new Short. Lookup. Table(0, inverser); n Supprimer le rouge short[] ident = new short[256]; short[] zero = new short[256]; for (int i = 0; i < 256; i++) { ident[i] = (short)i; zero[i] = (short)0; } short[][] sans. Rouge= { zero, ident }; Lookup. Table table = new Short. Lookup. Table(0, sans. Rouge); Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 27

La fabrique des “lookup” (1) Java AWT class Lookup. Fabrique { static short[] clair

La fabrique des “lookup” (1) Java AWT class Lookup. Fabrique { static short[] clair = new short[256]; static short[] meilleur. Clair = new short[256]; static short[] simplifie = new short[256]; static short[] inverser = new short[256]; static short[] ident = new short[256]; static short[] zero = new short[256]; static { for (int i = 0; i < 256; i++) { clair[i] = (short)(128 + i / 2); meilleur. Clair[i] = (short)(Math. sqrt((double)i / 255. 0) * 255. 0); simplifie[i] = (short)(i - (i % 32)); inverser[i] = (short)(255 - i); ident[i] = (short)i; zero[i] = (short)0; } } static Lookup. Op create. Clair() { return new Lookup. Op(new Short. Lookup. Table(0, clair), null); } static Lookup. Op create. Meilleur. Clair() { return new Lookup. Op( new Short. Lookup. Table(0, meilleur. Clair), null); } static Lookup. Op create. Simplifie() { return new Lookup. Op( new Short. Lookup. Table(0, simplifie), null); } static Lookup. Op create. Inverser() { return new Lookup. Op(new Short. Lookup. Table(0, inverser), null); }. . . } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 28

La fabrique des “lookup” (2) Java AWT class Lookup. Fabrique {//suite. . . static

La fabrique des “lookup” (2) Java AWT class Lookup. Fabrique {//suite. . . static short[][] rouge. Seul = { inverser, ident }; static short[][] vert. Seul = { ident, inverser, ident }; static short[][] bleu. Seul = { ident, inverser }; static Lookup. Op create. Inverser. Rouge() { return new Lookup. Op( new Short. Lookup. Table(0, rouge. Seul), null); } static short[][] sans. Rouge= { zero, ident }; static short[][] sans. Vert = { ident, zero, ident }; static short[][] sans. Bleu = { ident, zero }; static Lookup. Op create. Sans. Rouge() { return new Lookup. Op( new Short. Lookup. Table(0, sans. Rouge), null); } } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 29

Niveau de gris n Pour passer en niveau de gris, on utilise une opération

Niveau de gris n Pour passer en niveau de gris, on utilise une opération de conversion d’espace de couleurs Color. Convert. Op n Un exemple de construction est Java AWT new Color. Convert. Op(Color. Space. get. Instance(Color. Space. CS_GRAY), null)); n Les constructeurs sont: Color. Convert. Op(Color. Space src. Cspace, Color. Space dst. Cspace, Rendering. Hints hints) Color. Convert. Op(Color. Space cspace, Rendering. Hints hints) Color. Convert. Op(ICC_Profile[] profiles, Rendering. Hints hints) Color. Convert. Op(Rendering. Hints hints) n Les deuxièmes et quatrièmes sont utiles pour les Buffered. Image, les deux autres opèrent directement sur les raster. n Un espace de couleur (comme RGB ou HSV) indique comment sont codées les couleurs. Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 30

Le panneau glissant n En cliquant ou en glissant avec la souris, on “déplace”

Le panneau glissant n En cliquant ou en glissant avec la souris, on “déplace” la ligne verticale et on découvre l’image transformée n Ce panneau contient les deux images. n A chaque événement, des rectangle de détourage (clipping) sont calculés pour n’afficher que la partie concernée. Java AWT public class Split. Image. Panel extends JPanel { private Buffered. Image image; // source private Buffered. Image tr. Image; // transformee private int split. X; . . }. . public void split. X = } mouse. Pressed(Mouse. Event me) { me. get. X(); repaint(); mouse. Dragged(Mouse. Event me) { me. get. X(); repaint(); Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 31

le dessin Java AWT public void paint. Component(Graphics g) { super. paint. Component(g); Graphics

le dessin Java AWT public void paint. Component(Graphics g) { super. paint. Component(g); Graphics 2 D g 2 = (Graphics 2 D)g; int width = get. Preferred. Size(). width; int height = get. Preferred. Size(). height; g 2. clear. Rect(0, 0, width, height); g 2. set. Clip(split. X, 0, width - split. X, height); g 2. draw. Image(get. Image(), 0, 0, null); if (split. X == 0 || tr. Image == null) return; g 2. set. Clip(0, 0, split. X, height); g 2. draw. Image(tr. Image, 0, 0, null); Line 2 D split. Line = new Line 2 D. Float(split. X, 0, split. X, height); g 2. set. Clip(null); g 2. set. Color(Color. white); g 2. draw(split. Line); } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 32