Placage de texture (2/2) Par Xavier Michelon |
La dernière fois, nous avons chargé une image JPEG grâce à la bibliothèque JPEG. Aujourdhui, 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 quon 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 louverture se passe bien, on récupère la taille de limage avec la fonction TIFFGetField(), puis on alloue un tableau mono-dimensionnel de la taille de limage avec TIFFmalloc(). Un pixel dimage correspond à un quadruplet RGBA, stocké sur 4 octets, ce qui correspond à un entier (type uint32). Si lallocation se passe correctement, on peut lancer la lecture de limage grâce à la fonction TIFFReadRGBAImage(). Ici, il ny a pas besoin de faire un balayage comme nous lavons fait avec la libjpeg. Au final, limage 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 navons plus besoin avec un appel à _TIFFfree(), puis on ferme le fichier avec TIFFClose().
|