原文地址:(一個搞圖像處理的好博客)
http://blog.csdn.net/liminlu0314/article/details/7072007
一、簡單的調用
關於GDAL的使用,網上的資料都很多,主要還是要熟悉GDAL的組織結構,類以及類的函數等,熟悉了,使用GDAL就不在話下了。最常用的就是動態庫的GDAL,當然你也可以使用靜態庫,這里只是簡單的介紹使用動態GDAL庫來做開發。
首先打開VS,新建一個工程,控制台的就成。然后在工程的屬性對話框中,找到【配置屬性】-【C/C++】-【常規】,右側的【附加包含目錄】中,將GDAL的include文件夾路徑填寫到這里,如下圖:
第二、繼續在屬性對話框中,找到【配置屬性】-【鏈接器】-【常規】,右側的【附加庫目錄】中,將GDAL的lib文件夾路徑填寫到這里,如下圖:
第三、在【配置屬性】-【鏈接器】-【輸入】,右側的【附加依賴項】中,將gdal_i.lib填寫到此處。然后點擊確定即可。至此,使用GDAL的環境全部搭建完成,剩下的就是在您的代碼中使用GDAL了。
將下面的代碼(代碼摘自GDAL官方指南:http://gdal.org/gdal_tutorial.html)貼到剛才新建的工程中的cpp文件中,保存后編譯,正常情況下會提示生成成功,然后運行,會在控制台上將圖像的信息輸出。
#include "gdal_priv.h" #include "cpl_conv.h" //for CPLMalloc() int main() { //注冊文件格式 GDALAllRegister(); const char* pszFile = "C:\\Test.img"; GDALDataset *poDataset; //使用只讀方式打開圖像 poDataset = (GDALDataset*) GDALOpen( pszFile,GA_ReadOnly ); if( poDataset == NULL ) { printf( "File: %s不能打開!\n",pszFile); return 0; } //輸出圖像的格式信息 printf( "Driver:%s/%s\n", poDataset->GetDriver()->GetDescription(), poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME) ); //輸出圖像的大小和波段個數 printf( "Size is%dx%dx%d\n", poDataset->GetRasterXSize(),poDataset->GetRasterYSize(), poDataset->GetRasterCount()); //輸出圖像的投影信息 if( poDataset->GetProjectionRef() != NULL ) printf( "Projectionis `%s'\n", poDataset->GetProjectionRef() ); //輸出圖像的坐標和分辨率信息 double adfGeoTransform[6]; if( poDataset->GetGeoTransform( adfGeoTransform) == CE_None ) { printf( "Origin =(%.6f,%.6f)\n", adfGeoTransform[0], adfGeoTransform[3]); printf( "PixelSize = (%.6f,%.6f)\n", adfGeoTransform[1], adfGeoTransform[5]); } GDALRasterBand *poBand; int nBlockXSize, nBlockYSize; int bGotMin, bGotMax; double adfMinMax[2]; //讀取第一個波段 poBand = poDataset->GetRasterBand( 1 ); //獲取圖像的塊大小並輸出 poBand->GetBlockSize(&nBlockXSize, &nBlockYSize ); printf( "Block=%dx%dType=%s, ColorInterp=%s\n", nBlockXSize, nBlockYSize, GDALGetDataTypeName(poBand->GetRasterDataType()), GDALGetColorInterpretationName( poBand->GetColorInterpretation())); //獲取該波段的最大值最小值,如果獲取失敗,則進行統計 adfMinMax[0] = poBand->GetMinimum( &bGotMin); adfMinMax[1] = poBand->GetMaximum( &bGotMax); if( ! (bGotMin&& bGotMax) ) GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax); printf( "Min=%.3fd,Max=%.3f\n", adfMinMax[0], adfMinMax[1] ); //輸出圖像的金字塔信息 if( poBand->GetOverviewCount() > 0 ) printf( "Band has%d overviews.\n", poBand->GetOverviewCount() ); //輸出圖像的顏色表信息 if( poBand->GetColorTable() != NULL) printf( "Band hasa color table with %d entries.\n", poBand->GetColorTable()->GetColorEntryCount() ); float *pafScanline; int nXSize = poBand->GetXSize(); //讀取圖像的第一行數據 pafScanline = (float*) CPLMalloc(sizeof(float)*nXSize); poBand->RasterIO(GF_Read, 0, 0, nXSize,1, pafScanline, nXSize,1, GDT_Float32, 0, 0 ); CPLFree(pafScanline); //記得要釋放空間 //關閉文件 GDALClose((GDALDatasetH)poDataset); }
二、GDAL源代碼調試
在很多時候我們需要看看GDAL的內部實現,當然可以直接查看GDAL的源代碼,但是直接看源代碼,不能很好的理解,這時候就需要調試查看源代碼中變量的內容。調試GDAL的源代碼,需要GDAL的debug版本,以及編譯GDAL的時候的pdb等調試文件。當然也可以把GDAL的源代碼加入到你的工程中,但是這樣太費時費力。
下面就有一個很簡單的方法,可以直接調試進GDAL的源代碼中,首先編譯一下GDAL的debug版本,將編譯生成的文件,主要有gdal18.dll,gdal_i.exp,gdal_i.lib,gdal.lib,gdal18.pdb,gdal18.ilk,gdal18.exp等文件,將gdal18開頭的文件拷貝到自己工程的生成目錄中,然后調試自己的程序,在執行到GDALOpen函數(或者其他GDAL的函數)時按F11鍵,就會進入到GDAL的源代碼中進行調試GDAL代碼。
三、GDAL使用示例
1、使用GDAL進行圖像裁切,參考http://blog.csdn.net/liminlu0314/article/details/6136512
2、使用GDAL進行圖像重采樣,參考http://blog.csdn.net/liminlu0314/article/details/6130064
3、使用GDAL創建金字塔,參考http://blog.csdn.net/liminlu0314/article/details/6127755
4. CSDN 上一個GDAL專欄:http://blog.csdn.net/column/details/gdal.html