Placage de texture (2/2)
Par Xavier Michelon


 
 
Chargement d'image TIFF

La dernière fois, nous avons chargé une image JPEG grâce à la bibliothèque JPEG. Aujourd’hui, nous allons placer dans notre première texture une image lue dans un fichier TIFF, avec la bibliothèque libtiff (référence [8]). Le format TIFF (Tag Image File Format) est un format de fichier sans perte de qualité et qui offre la possibilité de stocker une couche alpha pour la transparence des images. Je ne vais pas détailler les prototypes des fonctions utilisées pour la lecture du fichier TIFF, vous verrez qu’on trouve bon nombre de similitudes avec la bibliothèque JPEG. Voici la portion de code qui permet de lire une image TIFF :

TIFF* tif = TIFFOpen(fichier, "r");
if (tif) {
  TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &l);
  TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
  npixels = l * h;
  raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32));
  if (raster != NULL) {
    /* lecture de l'image */
    if (TIFFReadRGBAImage(tif, l, h, raster, 1)) {
     /* transfert de l'image vers le tableau 'image' */
      for (i=0;i<256;i++)
        for (j=0;j<256;j++) {
          image[i][j][0]=((unsigned char *)raster)[i*256*4+j*4+0];
          image[i][j][1]=((unsigned char *)raster)[i*256*4+j*4+1];
          image[i][j][2]=((unsigned char *)raster)[i*256*4+j*4+2];
        }
    }    
else {
printf("erreur de chargement du fichier %s\n",fichier);
    exit(0);
  }
_TIFFfree(raster);
}
TIFFClose(tif);

Dans un premier temps, on ouvre le fichier image avec TIFFOpen(). Si l’ouverture se passe bien, on récupère la taille de l’image avec la fonction TIFFGetField(), puis on alloue un tableau mono-dimensionnel de la taille de l’image avec TIFFmalloc(). Un pixel d’image correspond à un quadruplet RGBA, stocké sur 4 octets, ce qui correspond à un entier (type uint32). Si l’allocation se passe correctement, on peut lancer la lecture de l’image grâce à la fonction TIFFReadRGBAImage(). Ici, il n’y a pas besoin de faire un balayage comme nous l’avons fait avec la libjpeg. Au final, l’image est placée dans le tableau ‘raster’. Il ne reste plus qu’à réorganiser les données  de ‘raster’ dans un tableau à 3 dimensions nommé ‘image’, compatible avec la fonction glTexImage2D(). Pour faire les choses dans les règles, on libère les données contenues dans ‘raster’ et dont nous n’avons plus besoin avec un appel à _TIFFfree(),  puis on ferme le fichier avec TIFFClose().