libtiff库使用
此文章为了记录我在使用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库使用的更多相关文章
- C++学习笔记23:库
静态库(Archives) 后缀一般为"*.a" 使用两个目标文件创建单一静态库的编译与链接命令:ar cr libtest.a test1.o test2.o 链接器搜索静态库 ...
- 在Window下编译LibGeotiff(含Libtiff)
核心提示:1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件. 1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作 ...
- QT库在Windows上的编译
1.从http://www.qtcentre.org/下载QT源代码,注意是源代码.我下载到的是QT4.5.1版,文件名为qt-win-opensource-src-4.5.1.zip: 2.解压,注 ...
- VC++下编译Libgeotiff(含Libtiff)
转自原文Win10+VC++下编译Libgeotiff(含Libtiff)详细图文教程 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作GeoTiff文件的库.同 ...
- libTIFF 图像读取与保存
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/YhL_Leo/article/details/49848391 1 头文件 libtif ...
- 利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
--------------------------------------------------低调的分割线-------------------------------------------- ...
- 安装Ubuntu双系统系列——64位Ubuntu安装H3C的INode客户端
学校使用的是Inode客户端认证上网的.如果是使用Ubuntu 32位版本,可以完美地安装并能够连接到网站.但是如果安装的是Ubuntu desktop 12.10 amd64版本,则发现之前的&qu ...
- Qt configure 参数不完全说明
只需要加个 -fast参数就ok了.其他参数视自己情况而定,比如你不需要qt3支持可以添加-no-qt3support,或者不需要webkit插件 -no-webkit配置参数选项: 前面是*号的表示 ...
- CCImage
#ifndef __CC_IMAGE_H__ #define __CC_IMAGE_H__ //派生于CCObject #include "cocoa/CCObject.h" // ...
随机推荐
- Cv图像处理
http://wiki.opencv.org.cn/index.php/Cv%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86 看看知识点,虽然是C 版本.
- LeetCode OJ 82. Remove Duplicates from Sorted List II
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...
- 实参时丢弃了类型 discards qualifiers discards qualifiers问题
百思不得其解,于是百度,google吧.. 发现Stackoverflow上也有人有相同的问题 下面是他的问题: For my compsci class, I am implementing a S ...
- openCV(二)---iOS中使用openCV的图片格式转换
可以实现将UIImage和IplImage类型实现相互转换 //由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构. - (IplImage *)C ...
- 常用的opengl函数(三)
glBlendFunc 定义像素算法. void WINAPI glBlendFunc(GLenum sfactor,GLenum dfactor); 参数编辑 sfactor 指定红绿蓝和 al ...
- phpStudy环境配置多个站点,绑定域名
经常做网站的朋友,往往要在自已的电脑同时建立多个站点,而phpstudy这款软件就能很好的解决这个问题,大家看下图 点击上图中的 其它选项菜单 ,就会弹出下面的对话框,然后点击 站点域名管理 然 后在 ...
- 修改apache配置文件去除thinkphp url中的index.php
例如你的原路径是 http://localhost/test/index.php/index/add那么现在的地址是 http://localhost/test/index/add如何去掉index. ...
- TCPIP header
tcp packet: tcp header: ip header:
- ARC属性中还能使用assign,copy,retain这些关键字吗
http://blog.sina.com.cn/s/blog_6531b9b80101c6cr.html 很早以前比较弱,网上不知道哪里看了篇博文,留下了ARC属性中不能使用retain关键 ...
- lucene特殊字符处理
这是个郁闷的问题,今天遇到了,但在lucene中查询的关键字保护有特殊字符,譬如--,会出现如下异常: org.apache.lucene.queryParser.ParseException: Ca ...