Images

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 :

Exercices

  1. 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 ?

  2. Écrivez le code de la classe BruteRasterImage qui implémente l’interface Image. La classe devra avoir un constructeur prenant en paramètre une matrice Color[][] pixels.

  3. 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.

  4. 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.

  5. 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 classe BruteRasterImage de distinguer les deux cas possibles ?

  6. Écrivez le code de la classe PaletteRasterImage qui implémente l’interface Image. La classe devra avoir un constructeur prenant en paramètre List<Color> palette et byte[][] indexesOfColors.

  7. Quel est le code dupliqué entre les deux classes BruteRasterImage et PaletteRasterImage ?

  8. Créez un classe abstraite AbstractImage qui sera étendue par BruteRasterImage et PaletteRasterImage afin d’éviter la duplication de code.

  9. Écrivez le code de la classe SparseImage qui implémente l’interface Image. La classe devra avoir un constructeur prenant en paramètre List<Pixel> nonWhitePixels.

  10. Écrivez le code de la classe VectorImage qui implémente l’interface Image. La classe devra avoir un constructeur prenant en paramètre List<Shape> shapes.

  11. Afin de stocker les couleurs des pixels dans SparseImage, on peut utiliser l’interface Map<K,V>. Cette interface, qui est implémentée par HashMap<K,V>, permet d’associer des clés (de type K) à des valeurs (de type V). Elle contient entre autre les méthodes suivantes :

    • boolean containsKey(Object key): Returns true if this map contains a mapping for the specified key.
    • V get(Object key): Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.
    • V getOrDefault(Object key, V defaultValue): Returns the value to which the specified key is mapped, or defaultValue if this map contains no mapping for the key.
    • V put(K key, V value): Associates (maps) the specified value with the specified key in this map.

    Changer le code de la classe SparseImage pour utiliser un Map qui stockera les associations entre les positions et les couleurs des pixels.

  12. On souhaiterait modifier les images après leur construction. Qu’est-ce qu’il faudrait modifier pour cela dans le code de BruteRasterImage et PaletteRasterImage ?

  13. Même question pour les classes SparseImage et VectorImage.