GDAL源碼剖析 之GDAL開發及其調試 (轉)


原文地址:(一個搞圖像處理的好博客)

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

 


免責聲明!

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



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