此文章为了记录我在使用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. java编码问题

    工作中经常遇到java编码问题,由于缺乏研究,总是无法给出确切的答案,这个周末在网上查了一些资料,在此做些汇总. 问题一:在java中读取文件时应该采用什么编码? Java读取文件的方式总体可以分为两 ...

  2. JavaScript性能优化技巧之函数节流

    函数节流技术的主要思路是,通过一个定时器,阻断连续重复的函数调用.对于我们自己内部使用的函数,这通常意义不大,也不推荐使用这个技术,它可能会丢失对某些数据的处理.但是对于在用户界面调用的函数,却非常有 ...

  3. org.hibernate.exception.JDBCConnectionException: could not execute query

    最近在做一个项目,测试的时候是没有问题的,但是放到服务器上以后,第二天就会出现下面的异常.重启Tomcat服务器后就正常了,但是下一天还是会出现同样的异常..... 我就查了一些资料最终把问题给解决了 ...

  4. PopUpManager弹出窗口

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  5. Row_Number实现分页

    1:首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号的集合 2:再查询该集合的 第 1 ...

  6. ios中关于UIImagePickerController的一些知识总结

    记得添加MobileCoreServices.framework 及导入#import <MobileCoreServices/MobileCoreServices.h> @interfa ...

  7. 将decimal类型的数据转成2.12这样价钱的显示方式

    UnitPrice = string.Format("{0:.00}", m.UnitPrice),

  8. document.querySelectorAll遍历(forEach小解)

    document.querySelectorAll兼容性良好,在之前的项目中就其遍历方式出了错误,先做个小结: 1.for循环 传统遍历方法 for(var i= 0; i< document. ...

  9. mysql具体语句示例

    建表:(not null ,auto_increment, unique , primary key) create database balfish;use balfish;create table ...

  10. HDU2586 How far away ? 邻接表+DFS

    题目大意:n个房子,m次询问.接下来给出n-1行数据,每行数据有u,v,w三个数,代表u到v的距离为w(双向),值得注意的是所修建的道路不会经过一座房子超过一次.m次询问,每次询问给出u,v求u,v之 ...