使用GDAL生成快视图主要有两个步骤,第一重采样生产小图像;第二将生成的小图像CreateCopy生成jpg格式或者png格式。由于GDAL不支持直接创建Jpg或者png的压缩格式的图像,所以中间需要一个中转的过程。
下面简单说明一下过程,代码就不贴了。首先通过获取采样比例计算输出图像的大小,这里可能需要根据需求自己定义。我遇到了一般有两种情况:第一种,将图像直接缩小到原来的10分之一(或者其他的比例),比如原图是20000×20000,那么快视图就是2000×2000。第二种,输出的图像范围在一个指定的范围,比如输出的快视图大小不能超过1024×1024,那么这里就需要通过原始图像的宽度和高度和这个1024计算采样比例。对于这两种情况,最后都是归结到一种情况来处理,那就是计算重采样比例,然后使用重采样比例进行采样。
关于使用GDAL重采样的部分代码可以参考之前的博客《如何使用GDAL重采样图像》,地址是:http://blog.csdn.net/liminlu0314/article/details/6130064。
使用重采样生产一个临时文件,这个文件是一个GDAL可以直接创建的图像,比如Tiff格式,或者img格式。接下来使用GDALOpen打开这个图像,然后使用CreateCopy函数创建一个jpg图像(png与之类似),最后把这个tiff临时文件删除即可。到这里的话,这个功能就算完成了,但是总觉得有点不爽的感脚。是啥呢,就是这个临时文件,就这么个小功能,来个临时文件,确实感觉不爽啊,下面就告诉大家怎么替换这个临时文件。
如果有人看过我的博客,应该会记得之前有篇博客,关于GDAL的内存文件,就是MEM格式的文件。博客叫《使用GDAL的MEM内存文件保存临时文件》,地址为:http://blog.csdn.net/liminlu0314/article/details/7166230。好了,就是他,我们可以使用MEM来替代这个临时文件。
关于MEM内存文件的使用,和普通的图像一样,只不过在创建的时候,驱动选择MEM,创建图像的时候不需要指定文件路径,直接用空字符串即可。
通过上面的分析,这里大致总结一下,修改GDAL重采样的代码,把里面的创建输出的图像创建为一个MEM的GDALDataset,这样重采样后的结果就存储在这个MEM的GDALDataset中了;接下来再创建一个JPG的驱动,使用JPG的驱动的CreateCopy函数来生成jpg图像就可以了。
PS:MEM文件的大小依赖于自己的电脑的内存,所以在创建MEM文件的时候确保自己的电脑内存能够存的下这个文件,如果太大就会失败,鉴于这里的快视图一般都比较小,此处使用MEM还是蛮合适的。