Images
Représentation d’image
On va considérer quatre manières de représenter une image en couleur et donc quatre classes d’images :
BruteRasterImage
: dans cette représentation, on stocke pour chaque pixel sa couleur sous la forme d’un objetColor
. Une image de ce type sera construite à partir d’une matriceColor[][] pixels
.PaletteRasterImage
: dans cette représentation, on stocke :- une palette contenant au plus 128
Color
qui correspondent aux couleurs utilisées dans l’image, - pour chaque pixel l’indice de sa couleur dans la palette avec un
byte
.
Cette manière de faire a l’avantage d’économiser de la mémoire pour les images ayant peu de couleurs (un
byte
prenant beaucoup moins de place en mémoire qu’uneColor
). Une image de ce type sera construite à partir deList<Color> palette
etbyte[][] indexesOfColors
.- une palette contenant au plus 128
SparseImage
: dans cette représentation, on stocke les coordonnées et la couleur de chaque pixel des pixels de l’image qui n’est pas blanc (Color.WHITE
). Une image de type sera construite à partir deList<Pixel> nonWhitePixels
. Pour cela, on a besoin d’une classePoint
:public class Point { public final int x, y; public Point(int x, int y) { this.x = x; this.y = y; } }
et d’une classe
Pixel
qui étendPoint
:VectorImage
: dans cette représentation, on stocke une liste de formes géométriques (utilisant interfaceShape
ci-dessous). Une image de type sera construite à partir deList<Shape> shapes
. Chaque forme géométrique (qui peut être un cercle, un rectangle, ) contient un certain nombre de points et définit la couleur des points à l’intérieur. La couleur d’un point de l’image est la couleur de la première forme dans la liste qui contient le point ou bien blanc si le point n’est contenu dans aucune forme.
Exercices
On souhaite définir une interface
Image
qui sera implémentée par les 4 classes pouvant représenter une image. L’interface ne permet pas (pour le moment) de modifier l’image une fois que celle-ci est crée. D’après vous quelles peuvent être les méthodes définies par cette interface ?Écrivez le code de la classe
BruteRasterImage
qui implémente l’interfaceImage
. La classe devra avoir un constructeur prenant en paramètre une matriceColor[][] pixels
.En java, on peut définir un tableau de taille 0 et donc une matrice de couleurs de taille \(0\times 0\). On considère qu’une image ayant une hauteur ou largeur égale à zéro n’a pas de sens. Il faut donc lever une exception dans le cas où on nous donne une matrice dont la hauteur ou la largeur est 0. Rajouter la levée d’une exception de type
IllegalArgumentException
(exception existant déjà en Java) dans le constructeur correspondant à ce cas.Une matrice en Java n’est pas forcément rectangulaire car chaque tableau représentant une “ligne” peut avoir une longueur différente. Lever une exception
IllegalArgumentException
dans le constructeur correspondant à ce cas.Il existe maintenant deux cas qui entraînent la levée d’une exception de type
IllegalArgumentException
. Comment peut-on changer le code pour permettre à l’utilisateur de la classeBruteRasterImage
de distinguer les deux cas possibles ?Écrivez le code de la classe
PaletteRasterImage
qui implémente l’interfaceImage
. La classe devra avoir un constructeur prenant en paramètreList<Color> palette
etbyte[][] indexesOfColors
.Quel est le code dupliqué entre les deux classes
BruteRasterImage
etPaletteRasterImage
?Créez un classe abstraite
AbstractImage
qui sera étendue parBruteRasterImage
etPaletteRasterImage
afin d’éviter la duplication de code.Écrivez le code de la classe
SparseImage
qui implémente l’interfaceImage
. La classe devra avoir un constructeur prenant en paramètreList<Pixel> nonWhitePixels
.Écrivez le code de la classe
VectorImage
qui implémente l’interfaceImage
. La classe devra avoir un constructeur prenant en paramètreList<Shape> shapes
.Afin de stocker les couleurs des pixels dans
SparseImage
, on peut utiliser l’interfaceMap<K,V>
. Cette interface, qui est implémentée parHashMap<K,V>
, permet d’associer des clés (de typeK
) à des valeurs (de typeV
). Elle contient entre autre les méthodes suivantes :boolean containsKey(Object key)
: Returnstrue
if this map contains a mapping for the specifiedkey
.V get(Object key)
: Returns the value to which the specifiedkey
is mapped, ornull
if this map contains no mapping for thekey
.V getOrDefault(Object key, V defaultValue)
: Returns the value to which the specifiedkey
is mapped, ordefaultValue
if this map contains no mapping for thekey
.V put(K key, V value)
: Associates (maps) the specifiedvalue
with the specifiedkey
in this map.
Changer le code de la classe
SparseImage
pour utiliser unMap
qui stockera les associations entre les positions et les couleurs des pixels.On souhaiterait modifier les images après leur construction. Qu’est-ce qu’il faudrait modifier pour cela dans le code de
BruteRasterImage
etPaletteRasterImage
?Même question pour les classes
SparseImage
etVectorImage
.