libtiff使用小记

来源:互联网 发布:linux下lnmp环境搭建 编辑:程序博客网 时间:2024/05/19 19:40

这两天就跟libtiff库卯上了,总会遇到奇怪的问题。现在问题或直接或曲折的解决了,一一记录下来。

 

问题一:TIFFSetDirectory函数的使用。

代码目的:交叉读取tiff中两页的每一行,假设第一页tif为tif_0,第二页tif为tif_1。
我的目的就是先读tif_0的第i行,然后读tif_1的第i行,而后i++。代码如下:
 
for(int i = 0; i < tifh; i++){
 
     res = TIFFSetDirectory(tif, 0);                    //设置在第一页
     res = TIFFReadScanline(tif, (tdata_t)ptemp, i);    //读取一行
 
     res = TIFFSetDirectory(tif, 1);                    //设置为第二页
     res = TIFFReadScanline(tif, (tdata_t)ptemp, i);    //读取一行
 
     ...
}
 
问题现象:TIFFReadScanline读取失败。i = 0时是成功的,然后每隔大概12行的样子又成功一次。
其他都是读取失败,返回-1。
 
即时不切换页码,但是每次读取行数据前都setdirectory得话也会出现这个问题:
for(int i = 0; i < tifh; i++){
 
     res = TIFFSetDirectory(tif, 0);                    //设置在第一页
     res = TIFFReadScanline(tif, (tdata_t)ptemp, i);    //读取一行
 
     ...
}

问题分析:把同事请来,捯饬了老半天发现,当调用TIFFSetDirectory函数后,tif切换至设定的directory,并且设置当前行为0 。
所以如果刚刚TIFFSetDirectory之后,我想读取第2行的数据,就会返回错误码。测试了下如果只调用TIFFSetDirectory一次,但是直接就读第n>0行时,同样会返回-1 。也不知道我们的理解是否正确,这是跟到TIFFReadScanline函数里发现的。

问题解决:本以为调用些其他的函数能够解决这个问题的,尝试了半天无解。不能这么一行一行交叉着读取,我只好改换方法了,按顺序读取完毕再做其他操作了。
所以也不算是解决了问题,只是避开了问题。

 

 

问题二:TIFFWriteEncodedStrip函数的使用。

问题分析:该函数的第三个参数是一个tdata_t类型的数据,也就是要写入tif的像素数据。
例如,我想生成的tif文件宽为w,高为h。
但我的tdata_t数据长度为w'*h,w'>w。
这在现实中应该常常碰到,因为对于单色的tif图像,像素按位排列,内存至少要一个字节,难免碰到不能被8整除的图像宽度值。
如果我硬生生的这么把这个tdata_t数据塞给TIFFWriteEncodedStrip函数,它会读取该数据中的前w*h位,并作为像素数据存入tif。
结果自然是生成的tif图像每行都有w'-w像素的偏移咯。
没办法,俺就用的TIFFWriteScanline。

写的够乱的,汗。

原创粉丝点击