转自文件
此文章为了记录我在使用libtiff库中的一些问题而写,将不断补充。
libtiff库是读取和写入tiff文件最主要的一个开源库,但文档写的实在不敢恭维。相对资料也是异常稀少。
libtiff库的安装
libtiff库的最新的最新版本可以从http://www.libtiff.org/下载,即可以编译源码也可以采用预先编译好的二进制文件。
本人推荐使用预编译版本,自己编译容易缺少依赖库,同时也可能出现一些莫名其妙的问题。
tiff文件的读写函数:
1 //获取strip大小2 tsize_t TIFFStripSize(TIFF *tif);3 //读取strip数据,buf缓冲区可由TIFFStripSize计算,size取-1代表读取整个strip7 tsize_t TIFFReadEncodedStrip(TIFF *tif, tstrip_t strip, tdata_t buf, tsize_t size);
将多色tiff文件分割
1 uint32 imageWidth, imageLength, TileWidth, TileLength, imageRowsPerStrip ; 2 uint16 imageCompression, imageSamplePerPixel ; 3 uint16 imagePlanarConfig, imagePhotoMetric, ResolutUnit, Orientation ; 4 uint16 bps ; 5 float X_Resolut, Y_Resolut ; 6 7 TIFF *tif_r, *tif_w ; 8 unsigned char *buf; 9 tstrip_t strip ;10 11 tif_r = TIFFOpen("image_4plane.tif", "r");12 if (!tif_r)13 {14 error_handler("Open Tiff File Error!");15 return -1;16 }17 /* 讀取 TIFF 標籤 */18 TIFFGetField(tif_r, TIFFTAG_IMAGEWIDTH, &imageWidth);19 TIFFGetField(tif_r, TIFFTAG_IMAGELENGTH, &imageLength);20 21 TIFFGetField(tif_r, TIFFTAG_BITSPERSAMPLE, &bps);22 TIFFGetField(tif_r, TIFFTAG_COMPRESSION, &imageCompression);23 TIFFGetField(tif_r, TIFFTAG_PHOTOMETRIC, &imagePhotoMetric);24 25 TIFFGetField(tif_r, TIFFTAG_SAMPLESPERPIXEL, &imageSamplePerPixel);26 TIFFGetField(tif_r, TIFFTAG_ROWSPERSTRIP, &imageRowsPerStrip);27 if (imageRowsPerStrip != 1)28 {29 error_handler("Rows Each Strip Is Not 1!");30 return -1;31 }32 33 TIFFGetField(tif_r, TIFFTAG_XRESOLUTION, &X_Resolut);34 TIFFGetField(tif_r, TIFFTAG_YRESOLUTION, &Y_Resolut);35 TIFFGetField(tif_r, TIFFTAG_RESOLUTIONUNIT, &ResolutUnit);36 37 TIFFGetField(tif_r, TIFFTAG_PLANARCONFIG, &imagePlanarConfig);38 TIFFGetField(tif_r, TIFFTAG_ORIENTATION, &Orientation);39 40 int stripsize = TIFFStripSize(tif_r);41 buf = (unsigned char *) malloc(stripsize) ;42 if (!buf)43 {44 error_handler("Allocate Buffer Failed!");45 }46 Mat ht_img(Size(imageWidth, imageLength),CV_8UC1,Scalar::all(0));47 const int color[7] = {0,1,2,3,4,5,6};48 unsigned char * pRow; 49 50 51 for (strip = 0; strip < TIFFNumberOfStrips(tif_r); strip++)52 {53 TIFFReadEncodedStrip(tif_r, strip, buf, (tsize_t) -1);54 pRow = ht_img.ptr(strip);55 for (int i_pixel = 0; i_pixel < imageWidth; i_pixel++)56 {57 pRow[i_pixel] = buf[i_pixel*imageSamplePerPixel + color[6]];58 }59 }60 imwrite("strip_out.tiff", ht_img);61 62 free(buf);63 TIFFClose(tif_r);64 printf("Done!\n");
参考文献:
1. libtiff库的使用
http://darkranger.no-ip.org/archives/v5/document/develop/libtiff_tutorial.htm
2. 关于如何判断一个tiff文件是tile或者是strip的说明
http://www.asmail.be/msg0054551721.html