LIBTIFF库的使用心得

VC2010使用libtiff库的环境配置:

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

库文件:libtiff.lib、libtiff.dll

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

源码中需要写入:

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

接下来就可以使用该库的API:

TIFF* TIFFOpen(const char*, const char*);//写入或读取tif文件。

该函数有两个参数。第一个参数用于输入图片文件的名称(绝度路径或相对路径)

第二个参数用于表示对图片文件的模式。"r"代表读。"w"代表写,"a"代表追加。返回一个tiff指针,以后所有的操作都可以通过该指针进行。

void TIFFClose(TIFF* tif);//用于释放图片在内存中的资源。Tif即为图片在库中的tif指针。

如:

 1 TIFF*tiff_r = TIFFOpen(“temp.tif”,”r”);
 2 
 3 If(tiff_r)
 4 
 5 {
 6 
 7     …..
 8 
 9 }
10 
11 TIFFClose(tiff_r);
int TIFFGetField(TIFF* tif, uint32 tag, ...);//用于获取tif图片的属性。

其属性主要包括如下(仅写出比较重要的几个)

 1 TIFFTAG_BITSPERSAMPLE  每个像素点中每个通道的颜色深度(即一个通道占几个字节)
 2 
 3 TIFFTAG_COLORMAP 色图:调色板图像的RGB映射
 4 
 5 TIFFTAG_COMPRESSION  压缩标准:COMPRESSION_NONE、COMPRESSION_PACKBITS 、COMPRESSION_LZW(一部分)
 6 
 7 TIFFTAG_IMAGELENGTH1 uint32* 图像长度 
 8 TIFFTAG_IMAGEWIDTH 1 uint32* 图像宽度
 9 
10 TIFFTAG_ROWSPERSTRIP1 uint32* 每个条的行数
11 TIFFTAG_XRESOLUTION 1 float* X分辨率|水平解析度
12 
13 TIFFTAG_YRESOLUTION1 float*? Y分辨率|竖直解析度
int TIFFSetField(TIFF*, uint32, ...);//用于设置tif图片的属性。

主要设置如下:

 1 TIFFSetField(image,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);//设置色彩模式 
 2 
 3 TIFFSetField(tif_r,TIFFTAG_IMAGEWIDTH,1024);//设置图像宽度。            TIFFSetField (tif_r,TIFFTAG_IMAGELENGTH, 2048);//设置图像高度
 4 
 5 TIFFSetField (tif_r,TIFFTAG_BITSPERSAMPLE, 16);//设置图像每通道的位数
 6 
 7 TIFFSetField (tif_r,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);//设置图像类型
 8 
 9 TIFFSetField (tif_r,TIFFTAG_SAMPLESPERPIXEL,3);//设置图像的通道数
10 
11 TIFFSetField (tif_r,TIFFTAG_XRESOLUTION, 72.000000);//x分辨率
12 
13 TIFFSetField (tif_r,TIFFTAG_YRESOLUTION, 72.000000);//y分别率
14 
15 TIFFSetField(image,TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); // 设置配置
16 
17 TIFFSetField(image,TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); // 设置Planar配置.
int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);//按行向图像写入数据,tif为图像指针,buf为需要写入的数据。row为需要写入图像的第几行,sample默认为0;

通过以上设置要写入tif图片的属性可以获取到写入该图片所需要的长度。

1 DWORDdwLeng = width * 3 *height;//在内存中存放该图片所需要的长度。
2 
3 Uint16*pImageData = new Uint16[dwLeng];//为存放数据分配内存空间。

如果将保存有tif图片的data数据信息生成一幅.tif图片,则步骤如下:

 1 Memset(pImageData,0,dwLeng*sizeof(Uint16);
 2 
 3 Memcpy(pImageData,data,width*height*3*sizeof(Uint16));
 4 
 5 for(intiheight = 0;iheight < height;iheight++)
 6 
 7 {
 8 
 9     Uint16* prow = new Uint16[width*3];
10 
11     Memcpy(prow,pImageData+(byte*)iheight*width*3*sizeof(Uint16),width*3*sizeof(Uint16);
12 
13     TIFFWriteScanline(tif,prow,iheight,0);
14 
15     Delete [] prow;
16 
17     Prow = NULL;
18 
19 }

TIFFWriteEncodedStrip函数的使用。

问题分析:该函数的第三个参数是一个tdata_t类型的数据,也就是要写入tif的像素数据。
由于可操作性太低,不易控制不推荐使用,推荐使用以下函数TIFFWriteScanline。

原文地址:https://www.cnblogs.com/ybqjymy/p/13672531.html