您的位置:首页 > 编程语言 > C语言/C++

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

2010-07-27 14:02 204 查看
最近在实习,前阵子用到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会自动使用金字塔中相应比例的缩略图数据,可以极大的提高这个比例图像的显示处理速度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: