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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM