您的位置:首页 > 其它

libtiff库的使用心得

2016-03-10 17:38 447 查看
VC2010使用libtiff库的环境配置:

头文件:tiff.h、tiffconf.h、tiffio.h、tiffvers.h

库文件:libtiff.lib、libtiff.dll

以上文件放到当前工作路径即可。

源码中需要写入:

#include
"tiffio.h"
#pragma
comment( lib,
".\\lib\\libtiff.lib")

接下来就可以使用该库的API:
TIFF* TIFFOpen(const
char*, const char*);//写入或读取tif文件。
该函数有两个参数。第一个参数用于输入图片文件的名称(绝度路径或相对路径)
第二个参数用于表示对图片文件的模式。"r"代表读。"w"代表写,"a"代表追加。返回一个tiff指针,以后所有的操作都可以通过该指针进行。
void TIFFClose(TIFF* tif);//用于释放图片在内存中的资源。Tif即为图片在库中的tif指针。

如:TIFF*tiff_r = TIFFOpen(“temp.tif”,”r”);
If(tiff_r)
{
…..
}
TIFFClose(tiff_r);

int TIFFGetField(TIFF* tif, uint32 tag, ...);//用于获取tif图片的属性。
其属性主要包括如下(仅写出比较重要的几个)
TIFFTAG_BITSPERSAMPLE 每个像素点中每个通道的颜色深度(即一个通道占几个字节)
TIFFTAG_COLORMAP 色图:调色板图像的RGB映射
TIFFTAG_COMPRESSION 压缩标准:COMPRESSION_NONE、COMPRESSION_PACKBITS 、COMPRESSION_LZW(一部分)
TIFFTAG_IMAGELENGTH1 uint32* 图像长度

TIFFTAG_IMAGEWIDTH 1 uint32* 图像宽度
TIFFTAG_ROWSPERSTRIP1 uint32* 每个条的行数

TIFFTAG_XRESOLUTION 1 float* X分辨率|水平解析度
TIFFTAG_YRESOLUTION1 float*? Y分辨率|竖直解析度
详细说明见:http://blog.csdn.net/augusdi/article/details/10396421
int TIFFSetField(TIFF*, uint32, ...);//用于设置tif图片的属性。
主要设置如下:
TIFFSetField(image,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);//设置色彩模式
TIFFSetField(tif_r,TIFFTAG_IMAGEWIDTH,1024);//设置图像宽度。 TIFFSetField (tif_r,TIFFTAG_IMAGELENGTH, 2048);//设置图像高度
TIFFSetField (tif_r,TIFFTAG_BITSPERSAMPLE, 16);//设置图像每通道的位数
TIFFSetField (tif_r,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);//设置图像类型

TIFFSetField (tif_r,TIFFTAG_SAMPLESPERPIXEL,3);//设置图像的通道数
TIFFSetField (tif_r,TIFFTAG_XRESOLUTION,
72.000000);//x分辨率
TIFFSetField (tif_r,TIFFTAG_YRESOLUTION, 72.000000);//y分别率
TIFFSetField(image,TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
// 设置配置
TIFFSetField(image,TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); //
设置Planar配置.

int TIFFWriteScanline(TIFF* tif,
void* buf, uint32 row, uint16 sample = 0);//按行向图像写入数据,tif为图像指针,buf为需要写入的数据。row为需要写入图像的第几行,sample默认为0;

通过以上设置要写入tif图片的属性可以获取到写入该图片所需要的长度。
DWORDdwLeng = width * 3 *height;//在内存中存放该图片所需要的长度。
Uint16*pImageData = new Uint16[dwLeng];//为存放数据分配内存空间。

如果将保存有tif图片的data数据信息生成一幅.tif图片,则步骤如下:
Memset(pImageData,0,dwLeng*sizeof(Uint16);
Memcpy(pImageData,data,width*height*3*sizeof(Uint16));

for(intiheight = 0;iheight < height;iheight++)
{
Uint16* prow = new Uint16[width*3];
Memcpy(prow,pImageData+(byte*)iheight*width*3*sizeof(Uint16),width*3*sizeof(Uint16);
TIFFWriteScanline(tif,prow,iheight,0);
Delete [] prow;
Prow = NULL;
}

TIFFWriteEncodedStrip函数的使用。

问题分析:该函数的第三个参数是一个tdata_t类型的数据,也就是要写入tif的像素数据。

由于可操作性太低,不易控制不推荐使用,推荐使用以下函数TIFFWriteScanline。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: