VC++下使用GDAL的經驗記錄

 

最近在實習,前陣子用到TIF(GeoTiff)圖像處理,在VC2005上用了一下GDAL,在此記錄下相關東西。

 

GDAL當前的最新版本已經到了1.7.2,由於除了Win32,還要與Windows MobilePocket PC打交道,所以也看了一下WinCE的支持情況,發現雖然其中一直都有wince目錄,不過最終發現只有1.4版的wince版本才真正可以編譯使用,後續版本的WinCE分支都只是擺設了:)

 

不過這裏的內容基本與版本無關

 

基本的東西自然不用多說,官網上的入門教程和示例還是很容易理解的,數據模型的解釋也很容易,下面的地址有基本內容的中文翻譯:

 

http://www.osgeo.org.cn/l18n/gdal/index.html

 

這裏總結一下碰到的GDAL技巧

 

文件讀寫:

 

GDAL中圖像的讀寫主要有三種:

GDALDataset::RasterIO(…)

GDALRasterBand::RasterIO(…)

GDALRasterBand:ReadBlock(...)WriteBlock(…)

經過我自己的測試,效率都相差不算很大,不過還是有一些區別的。

前兩者本質上差不多,只不過第一項可以一次讀取指定圖像範圍的所有波段信息,而第二種只讀取所在波段的信息。這兩個函數的參數都有原圖要讀取的區域,以及目標大小兩部分參數,根據這兩部分參數,RasterIO可以自動完成圖像的縮放(我只用到縮小)。第一種讀取,由於可以讀取所有波段,還有一些特殊的地方,後面說明。

 

ReadBlockWriteBlock是按照圖像文件的分塊組織讀取,分塊大小是圖像文件本身已經客觀存在的,由於適合文件分塊的讀取,所以速度是最快的,但是隻能按分好的某塊讀取,靈活性差。

 

GDALDataset::RasterIO的最後三個參數->讀取結果數據排列

 

這個函數讀取指定區域的所有波段,既然讀取所有波段,就有一個數據組織格式的問題。對於一般圖像,一個波段(實際顏色的一個分量)是8bit,那麼我們通過RasterIO取出來的數據就是byte* pData;(這裏的byte,可以是typedef unsigned char byte)。那麼對於24bit的真彩圖,pData裏要存儲紅綠藍(RGB)三個波段,RasterIO的最後三個參數就是指定這種組織方式的,具體概念大家到其API Document裏面摳說明去,這裏給出:nPixelSpace,  nLineSpace,  nBandSpace 三者,如果都爲0,則pData中數據的組織是:RRR...RGGG….GBBB...B(三個參數均使用了默認設置),如果設置爲(3,0,1),則可以排列成RGBRGBRGB…..(每像素3個數據位,每行可用數據位自動,每個波段1個數據位),後者更便於顯示。當然,Windows位圖數據顏色排列是BGR,那麼可以設置nBandCount=3,panBandMap=new int[]{3,2,1},這樣讀取波段的順序就是BGR~

 

 

二值Tif圖(1bit TIF 圖)處理

 

二值圖一般只有一個波段,並且這個波段只有1bit,但是即使如此,GDAL在讀取的時候,GetDataType也返回GDT_Byte,即認爲是8bit波段,中間會自動把每個1bit讀出爲8bit(值不變,仍只有01)。這也許是因爲C++中沒有一種合適的數據類型能表示非8bit倍數的數據大小(即使bool1bit,還有四值圖(2bit),八值圖(3bit)呢)。

統一成8bit對讀和運算處理沒什麼影響,但如果直接以此再Create一個GDALDataset並寫入,圖像就會突然變大8倍,因爲被寫入爲8bit單波段圖像了。這時候要使用Tiff的創建選項,Create函數有一個字符串數組傳入的創建選項(NBITS=1即創建1bit圖),這方面可以參考:

http://www.gdal.org/frmt_gtiff.html

 

 

金字塔(縮略圖)

 

即調用BuildOverView可以創建不同比例的縮略圖,GDAL默認會存成.ovr文件,只能是整數縮小比例。這樣,之後當調用RasterIO以相適應的縮小比例讀取圖像時,GDAL會自動使用金字塔中相應比例的縮略圖數據,可以極大的提高這個比例圖像的顯示處理速度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章