GDAL源码剖析 之GDAL开发及其调试 (转)
2014-09-01 11:23
260 查看
原文地址:(一个搞图像处理的好博客)
/article/1360994.html
首先打开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的debug版本,将编译生成的文件,主要有gdal18.dll,gdal_i.exp,gdal_i.lib,gdal.lib,gdal18.pdb,gdal18.ilk,gdal18.exp等文件,将gdal18开头的文件拷贝到自己工程的生成目录中,然后调试自己的程序,在执行到GDALOpen函数(或者其他GDAL的函数)时按F11键,就会进入到GDAL的源代码中进行调试GDAL代码。
2、使用GDAL进行图像重采样,参考/article/1361004.html
3、使用GDAL创建金字塔,参考/article/1361005.html
4. CSDN 上一个GDAL专栏:http://blog.csdn.net/column/details/gdal.html
/article/1360994.html
一、简单的调用
关于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); }
#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进行图像裁切,参考/article/1361003.html2、使用GDAL进行图像重采样,参考/article/1361004.html
3、使用GDAL创建金字塔,参考/article/1361005.html
4. CSDN 上一个GDAL专栏:http://blog.csdn.net/column/details/gdal.html
相关文章推荐
- GDAL源码剖析(六)之GDAL开发及其调试
- GDAL源码剖析(六)之GDAL开发及其调试
- GDAL源码剖析(六)之GDAL开发及其调试
- GDAL源码剖析 之GDAL开发及其调试 (转)
- DataGridView数据窗口控件开发方法及其源码提供下载
- 在项目中添加MVC源码进行开发、调试
- GDAL源码剖析(七)之GDAL RasterIO使用说明
- GDAL源码剖析(八)之编译GEOS和PROJ4库
- GDAL源码剖析(五)之Python命令行程序
- 基于WEB应用开发的java程序员必备工具(脚本调试工具、java剖析工具)
- GDAL源码剖析(三)之Swig编译和帮助文档生成
- GDAL源码剖析(一)
- openfire及其源码的开发和部署
- GDAL源码剖析(一)
- GDAL源码剖析(一)
- GDAL源码剖析(七)之GDAL RasterIO使用说明
- ruby 网页开发框架及其源码加密技术演示,开始提供下载
- 第四章 嵌入式系统的调试工具及其开发环境http://www.decell.org/article.asp?id=53
- GDAL源码剖析(二)之编译说明
- GDAL源码剖析(四)之命令行程序说明二