VC++下使用GDAL的经验记录

来源:互联网 发布:彩铃制作软件 编辑:程序博客网 时间:2024/05/20 02:52

最近在实习,前阵子用到TIF(GeoTiff)图像处理,在VC2005上用了一下GDAL,在此记录下相关东西。

 

GDAL当前的最新版本已经到了1.7.2,由于除了Win32,还要与Windows Mobile的Pocket 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可以自动完成图像的缩放(我只用到缩小)。第一种读取,由于可以读取所有波段,还有一些特殊的地方,后面说明。

 

ReadBlock和WriteBlock是按照图像文件的分块组织读取,分块大小是图像文件本身已经客观存在的,由于适合文件分块的读取,所以速度是最快的,但是只能按分好的某块读取,灵活性差。

 

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(值不变,仍只有0和1)。这也许是因为C++中没有一种合适的数据类型能表示非8bit倍数的数据大小(即使bool是1bit,还有四值图(2bit),八值图(3bit)呢)。

统一成8bit对读和运算处理没什么影响,但如果直接以此再Create一个GDALDataset并写入,图像就会突然变大8倍,因为被写入为8bit单波段图像了。这时候要使用Tiff的创建选项,Create函数有一个字符串数组传入的创建选项(NBITS=1即创建1bit图),这方面可以参考:

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

 

 

金字塔(缩略图)

 

即调用BuildOverView可以创建不同比例的缩略图,GDAL默认会存成.ovr文件,只能是整数缩小比例。这样,之后当调用RasterIO以相适应的缩小比例读取图像时,GDAL会自动使用金字塔中相应比例的缩略图数据,可以极大的提高这个比例图像的显示处理速度。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Imoagn/archive/2010/07/28/5768782.aspx

原创粉丝点击