Cette page contient des exemples de solutions pour le TP 1B2.

Exercice 1: rotation de 180°

Si L est la largeur de l'image et H est sa hauteur, en nombre de pixels, alors l'image tournée de 180° a les mêmes dimensions mais le pixel de coordonnées (x,y) dans l'image de départ se rtetrouve en (L-x-1,H-y-1) dans l'image résultat. Attention à la soustraction de 1: les coordonnées vont de (0,0) à (L-1,H-1).

On peut donc écrire la solution suivante en utilisant les fonctions du module pnm fourni:

   1 def retourner(image):
   2     L = image['largeur']
   3     H = image['hauteur']
   4     resultat = pnm.creer_image_couleur(L, H, image['maximum'])
   5     for x in range(L):
   6         for y in range(H):
   7             r, v, b = pnm.lire_pixel_couleur(image, x, y)
   8             pnm.ecrire_pixel_couleur(resultat, L-x-1, H-y-1, r, v, b)
   9     return resultat

Mais bien sûr, cette fonction ne manipule presque pas la structure de données, elle utilise les fonctions fournies. En fait, elle procède selon le principe des types abstraits. Si on veut réécrire cette fonction en manipulant directement la structure de données, on pourre procéder de la façon suivante:

   1 def retourner2(image):
   2     L = image['largeur']
   3     H = image['hauteur']
   4     entree = image['donnees']
   5 
   6     # création de la liste des valeurs
   7     sortie = [0] * (L * H * 3)
   8 
   9     # définition des valeurs des pixels
  10     for x in range(L):
  11         for y in range(H):
  12             pos_entree = (y * L + x) * 3
  13             pos_sortie = ((H-y-1) * L + (L-x-1)) * 3
  14             for i in range(3):
  15                 sortie[pos_sortie + i] = entree[pos_entree + i]
  16 
  17     # construction de la structure de l'image produite
  18     return {
  19         'largeur': L,
  20         'hauteur': H,
  21         'maximum': image['maximum'],
  22         'donnees': sortie
  23     }

Exercice 2: écriture au format PPM ASCII

Les données sont stockées dans la liste donnees dans le même ordre que ce que spécifie le format PPM, il suffit donc d'écrire l'en-tête suivie des données dans l'ordre où elles se trouvent. Il faut juste prendre soin d'écrire les valeurs en base 10 séparées par des caractères d'espacement, en l'occurence des retours à la ligne dans cette solution:

   1 def ecrire_ascii(image, nom_fichier):
   2     fichier = open(nom_fichier, "w")
   3     
   4     # écriture de l'en-tête
   5     fichier.write("P3 %d %d %d\n" %
   6         (image['largeur'], image['hauteur'], image['maximum']))
   7 
   8     # écriture de la liste des valeurs (écrites en base 10)
   9     for x in image['donnees']:
  10         fichier.write("%d\n" % x)

WikISN: TP format PNM/solution (last edited 2016-02-29 12:50:06 by LionelVaux)