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。