之前弄了一些遥感影像读取的工作,但是主要是针对航空影像,所以数据量相对较小,利用opencv基本可以搞定。最近需要处理的1G左右的航天影像,所以之前的方法基本不适用,直接内存的话,我的小笔记本不可实现,所以弄了几天利用GDAL将影像分块读取和显示,现在将几天的工作记录一下,给后来者尽一点微薄之力,也给以后遇到类似的问题留点资料。可能有不完善的地方,读者可以留言批评指正。
GDAL就不用解释了吧~
影像的分块读取和显示,根据字面来看,主要包括:分块读取和显示,其玄机就在两个函数里面:RasterIO()和StretchDIBits()(这里说明一下,RasterIO我用的是GDALRasterBand中的那个,我用StretchDIBits来显示,而没有采用bitblt,主要是因为效率问题)
在这里我的读取和显示影像的思路是:利用一个函数将影像分块读取封装起来,每次调用这个函数只读取指定区域的影像进入内存,并且是在绘图的函数中执行读取,在下一次读取之前,将上一次读取所占用的内存释放。所以,按照这个思路,一张无论多大的影像,其占用内存的大小只是,你进行分块后影像的大小和需要显示的大小。
先说一下RasterIO,如何分块读取,有关这个函数的介绍,如下:
GDALRWFlag eRWFlag, //读or写标记
int nXOff, //从哪里开始读
int nYOf