此文章为了记录我在使用libtiff库中的一些问题而写,将不断补充。

libtiff库是读取和写入tiff文件最主要的一个开源库,但文档写的实在不敢恭维。相对资料也是异常稀少。

libtiff库的安装

libtiff库的最新的最新版本可以从http://www.libtiff.org/下载,即可以编译源码也可以采用预先编译好的二进制文件。

本人推荐使用预编译版本,自己编译容易缺少依赖库,同时也可能出现一些莫名其妙的问题。

tiff文件的读写函数:

 //获取strip大小
tsize_t TIFFStripSize(TIFF *tif);
//读取strip数据,buf缓冲区可由TIFFStripSize计算,size取-1代表读取整个strip
tsize_t TIFFReadEncodedStrip(TIFF *tif, tstrip_t strip, tdata_t buf, tsize_t size);

将多色tiff文件分割

     uint32 imageWidth, imageLength, TileWidth, TileLength, imageRowsPerStrip ;
uint16 imageCompression, imageSamplePerPixel ;
uint16 imagePlanarConfig, imagePhotoMetric, ResolutUnit, Orientation ;
uint16 bps ;
float X_Resolut, Y_Resolut ; TIFF *tif_r, *tif_w ;
unsigned char *buf;
tstrip_t strip ; tif_r = TIFFOpen("image_4plane.tif", "r");
if (!tif_r)
{
error_handler("Open Tiff File Error!");
return -;
}
/* 讀取 TIFF 標籤 */
TIFFGetField(tif_r, TIFFTAG_IMAGEWIDTH, &imageWidth);
TIFFGetField(tif_r, TIFFTAG_IMAGELENGTH, &imageLength); TIFFGetField(tif_r, TIFFTAG_BITSPERSAMPLE, &bps);
TIFFGetField(tif_r, TIFFTAG_COMPRESSION, &imageCompression);
TIFFGetField(tif_r, TIFFTAG_PHOTOMETRIC, &imagePhotoMetric); TIFFGetField(tif_r, TIFFTAG_SAMPLESPERPIXEL, &imageSamplePerPixel);
TIFFGetField(tif_r, TIFFTAG_ROWSPERSTRIP, &imageRowsPerStrip);
if (imageRowsPerStrip != )
{
error_handler("Rows Each Strip Is Not 1!");
return -;
} TIFFGetField(tif_r, TIFFTAG_XRESOLUTION, &X_Resolut);
TIFFGetField(tif_r, TIFFTAG_YRESOLUTION, &Y_Resolut);
TIFFGetField(tif_r, TIFFTAG_RESOLUTIONUNIT, &ResolutUnit); TIFFGetField(tif_r, TIFFTAG_PLANARCONFIG, &imagePlanarConfig);
TIFFGetField(tif_r, TIFFTAG_ORIENTATION, &Orientation); int stripsize = TIFFStripSize(tif_r);
buf = (unsigned char *) malloc(stripsize) ;
if (!buf)
{
error_handler("Allocate Buffer Failed!");
}
Mat ht_img(Size(imageWidth, imageLength),CV_8UC1,Scalar::all());
const int color[] = {,,,,,,};
unsigned char * pRow; for (strip = ; strip < TIFFNumberOfStrips(tif_r); strip++)
{
TIFFReadEncodedStrip(tif_r, strip, buf, (tsize_t) -);
pRow = ht_img.ptr(strip);
for (int i_pixel = ; i_pixel < imageWidth; i_pixel++)
{
pRow[i_pixel] = buf[i_pixel*imageSamplePerPixel + color[]];
}
}
imwrite("strip_out.tiff", ht_img); free(buf);
TIFFClose(tif_r);
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

libtiff库使用的更多相关文章

  1. C++学习笔记23:库

    静态库(Archives) 后缀一般为"*.a" 使用两个目标文件创建单一静态库的编译与链接命令:ar cr libtest.a  test1.o test2.o 链接器搜索静态库 ...

  2. 在Window下编译LibGeotiff(含Libtiff)

    核心提示:1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件. 1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作 ...

  3. QT库在Windows上的编译

    1.从http://www.qtcentre.org/下载QT源代码,注意是源代码.我下载到的是QT4.5.1版,文件名为qt-win-opensource-src-4.5.1.zip: 2.解压,注 ...

  4. VC++下编译Libgeotiff(含Libtiff)

    转自原文Win10+VC++下编译Libgeotiff(含Libtiff)详细图文教程 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作GeoTiff文件的库.同 ...

  5. libTIFF 图像读取与保存

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/YhL_Leo/article/details/49848391 1 头文件 libtif ...

  6. 利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别

    --------------------------------------------------低调的分割线-------------------------------------------- ...

  7. 安装Ubuntu双系统系列——64位Ubuntu安装H3C的INode客户端

    学校使用的是Inode客户端认证上网的.如果是使用Ubuntu 32位版本,可以完美地安装并能够连接到网站.但是如果安装的是Ubuntu desktop 12.10 amd64版本,则发现之前的&qu ...

  8. Qt configure 参数不完全说明

    只需要加个 -fast参数就ok了.其他参数视自己情况而定,比如你不需要qt3支持可以添加-no-qt3support,或者不需要webkit插件 -no-webkit配置参数选项: 前面是*号的表示 ...

  9. CCImage

    #ifndef __CC_IMAGE_H__ #define __CC_IMAGE_H__ //派生于CCObject #include "cocoa/CCObject.h" // ...

随机推荐

  1. <context:annotation-config> 和 <context:component-scan>的区别

    转自:GOOD spring <context:annotation-config> 跟 <context:component-scan>诠释及区别 <context:a ...

  2. thinkphp 实现微信公众号开发(二)--实现自定义菜单

    IndexController.class.php <?php namespace Home\Controller; use Think\Controller; class IndexContr ...

  3. hdu_2446_Shell Pyramid(数学,二分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2446 题意:题面很大,有用的就那么几句,意思就是用自然数来堆它画的那个金字塔,比如第一个金字塔的第一个 ...

  4. Java&&As3.0 中的final 关键字

    Java和AS3.0关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.   可以修饰的对象:   fin ...

  5. 数据库sql语句为什么要用绑定形式?

    基于两点: 1,安全性,防sql注入: 2,共享资源,相似的sql能被缓存而不是重新解析. 淘测试给出了一个很好的理由:http://www.taobaotesting.com/blogs/859

  6. px和sp什么区别

    都表示像素,只不过sp通常表示文字大小: <TextView android:layout_width="wrap_content" android:layout_heigh ...

  7. perl脚本之目录

    来源: http://www.cnblogs.com/itech/archive/2013/02/20/2919204.html http://stackoverflow.com/questions/ ...

  8. 8.4 sikuli 集成进eclipse 报错:Unsupported major.minor version 51.0

    8.3中的问题Win32Util.dll: Can't load 32-bit .dll on a AMD 64 bit platform  解决之后,执行还是会有报错:Unsupported maj ...

  9. NoSql的产生

    主流的关系型数据库:Microsoft SQLServer, IBM DB2, Oracle, MySQL, Microsoft Access, Sybase,IBM Informix 随着互联网we ...

  10. IE 和 FF 写不同的CSS

    .FireFox 下如何使连续长字段自动换行 众所周知IE中直接使用word-wrap:break-word 就可以了, FF中我们使用JS插入的技巧来解决 <style type=" ...