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。