转自文件libtiff库使用
此文章为了记录我在使用libtiff库中的一些问题而写,将不断补充。
libtiff库是读取和写入tiff文件最主要的一个开源库,但文档写的实在不敢恭维。相对资料也是异常稀少。
libtiff库的安装
libtiff库的最新的最新版本可以从http://www.libtiff.org/下载,即可以编译源码也可以采用预先编译好的二进制文件。
本人推荐使用预编译版本,自己编译容易缺少依赖库,同时也可能出现一些莫名其妙的问题。
tiff文件的读写函数:
1 //获取strip大小 2 tsize_t TIFFStripSize(TIFF *tif); 3 //读取strip数据,buf缓冲区可由TIFFStripSize计算,size取-1代表读取整个strip 7 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!
");
参考文献:
1. libtiff库的使用
http://darkranger.no-ip.org/archives/v5/document/develop/libtiff_tutorial.htm
2. 关于如何判断一个tiff文件是tile或者是strip的说明
http://www.asmail.be/msg0054551721.html
