La fonction suivante sauvegarde l'image 2D en Tiff 32 bits. l'échantillonnage (dimension physique du pixel en mètre) est passé grâce à taille_pixel. res_unit est un tag propre à libTIFF.
#include <tiffio.h> /*save a C++ vector array (double) into a TIFF.*/ void SAV_Tiff2D(std::vector<double> const &Img2D, string chemin, double taille_pixel) { int dim=pow(img2D.size(),0.5); float xres, yres; uint16 res_unit; TIFF *tif_out= TIFFOpen(chemin.c_str(), "w");//"w"->ecraser, "a"->ajouter TIFFSetField (tif_out, TIFFTAG_IMAGEWIDTH, dim); TIFFSetField (tif_out, TIFFTAG_IMAGELENGTH, dim); TIFFSetField (tif_out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField (tif_out, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField (tif_out, TIFFTAG_ROWSPERSTRIP, 1); TIFFSetField (tif_out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); TIFFSetField (tif_out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); TIFFSetField (tif_out, TIFFTAG_BITSPERSAMPLE, 32); TIFFSetField (tif_out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); TIFFSetField (tif_out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); //fixer la résolution xres = yres = 0.01/taille_pixel; //nbpixel par resunit (par centimetre)=0.01m/taille_pixel en metre res_unit = RESUNIT_CENTIMETER; TIFFSetField(tif_out, TIFFTAG_XRESOLUTION, xres); TIFFSetField(tif_out, TIFFTAG_YRESOLUTION, yres); TIFFSetField(tif_out, TIFFTAG_RESOLUTIONUNIT, res_unit); tsize_t strip_size = TIFFStripSize (tif_out); tstrip_t strips_num = TIFFNumberOfStrips (tif_out); float* strip_buf=(float*)_TIFFmalloc(strip_size); for (unsigned int s=0; s<strips_num; s++) { for (unsigned int col=0; col<dim; col++) { unsigned int cpt=col+dim*s; strip_buf[col]=(float)img2D[cpt]; //transtypage vers 32 bits } TIFFWriteEncodedStrip (tif_out, s, strip_buf, strip_size); } _TIFFfree(strip_buf); TIFFWriteDirectory(tif_out); TIFFClose(tif_out); }
La compilation nécessite un lien vers libTIFF :
-ltiff