libtiff使用小记

这两天就跟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。

写的够乱的,汗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值