Comprendre quelques opérations de manipulation d'images.

Objectif.

Ce projet vous propose de compléter ce logiciel de dessin bien connu avec différentes fonctionnalités basiques comme le tracé de courbes, de lignes droites, de rectangles ou encore le remplissage de forme et la rotation d'images. Le but de ce tutoriel est de comprendre comment un code dessine dans une image.

Introduction.

  1. Pour commencer, prendre connaissance des fonctionnalités attendues pour ce logiciel en utilisant la proglet en mode démo (option à cocher en bas à droite de l'onglet paintbrush). L'option hexa code vous montre que cette image est en fait constituée de 32 pixels de large sur 32 pixels de haut (soit 1024 pixels), chaque pixel contenant une couleur encodée sous la forme d'un nombre entre 0 et 15. Dans ce mode, une couleur est représentée par son numéro au format hexadécimal : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.
  2. Observez la mise à jour des codes numériques de chaque pixel lors du remplissage d'une forme par exemple.
  3. Passer ensuite en mode proglet, les fonctionnalités précédentes ne fonctionnent plus ! Vous devez vous même programmer ces fonctionnalités. Il faut pour cela recopier le squelette de programme suivant et compléter chaque fonction.
  4. Afin de modifier les pixels de l'image, vous disposez de deux actions possibles :
    • getPixel(x,y) renvoie le code couleur du pixel de coordonnées (x,y).
    • setPixel(x,y,couleur) modifie le pixel de coordonnées (x,y) avec la couleur de numéro couleur.
  5. Chaque abscisse et chaque coordonnée doit varier dans l'intervalle [0,31]. Une erreur se déclenchera si vous utilisez ces fonctions hors de ces bornes.
On pourra partir du programme exemple donné ici.

Travail proposé.

  1. Compléter la fonction affichePoint qui est utilisée par le logiciel en mode Tracé à chaque fois qu'il est nécessaire de colorier un pixel.
  2. Compléter la fonction supprimePoint qui est utilisée par le logiciel en mode Gomme pour effacer une zone carrée de 3 pixels sur 3 pixels. Effacer un pixel revient à le colorier avec la couleur de fond (ici le blanc).
  3. Compléter la fonction afficheRectangle qui est utilisée par le logiciel en mode Rectangle. L'utilisateur désigne un premier point, déplace la souris vers un deuxième point puis relâche le bouton de la souris. Ces deux points constituent les extrémités de la diagonale du rectangle à tracer. Le logiciel fait alors appel à la fonction afficheRectangle en donnant en argument les coordonnées du premier point, les coordonnées du deuxième point ainsi que la couleur demandée pour tracer les contours du rectangle.
  4. Compléter la fonction remplir qui est utilisée par le logiciel en mode Remplir. Les coordonnées données en paramètres sont celles du pixel sélectionné par l'utilisateur avec son curseur pot de peinture. Attention cette solution demande un peu de réflexion pour éviter de faire boucler la procédure de remplissage mais il existe une solution relativement simple et concise (penser récursif...)!
  5. Compléter la fonction rotationGauche qui est utilisée par le logiciel lorque l'utilisateur presse le bouton Rotation gauche. Dans un premier temps, il est conseillé d'employer un tableau intermédiaire de dimension 32x32. Dans un deuxième temps, essayer de se passer d'un tableau intermédiaire en employant uniquement une variable intermédiaire (de type int) dans la boucle interne de votre programme.
  6. Compléter la fonction afficheLigne qui est utilisée par le logiciel en mode Ligne. L'utilisateur désigne un premier point, déplace la souris vers un deuxième point puis relâche le bouton de la souris. Ces deux points constituent les extrémités de la ligne à tracer. Le logiciel fait alors appel à la fonction afficheLigne en donnant en argument les coordonnées du premier point, les coordonnées du deuxième point ainsi que la couleur demandée pour tracer la ligne. Attention, cette fois les lignes à tracer ne sont pas forcément horizontales ou verticales. Comme le montre la figure ci-dessous, il faut savoir faire des approximations pour allumer les pixels les plus proches du segment idéal.
    Pour réaliser des calculs avec davantage de précision, vous pouvez manipuler provisoirement les coordonnées avec le format double.
    double dx = (double) x;
    Pour réaliser la conversion inverse (de double vers int), il faut prendre la partie entière d'un nombre réel avec la fonction Java floor(double x).
    int x = (int) floor(x);