传统相机拍摄的Jpeg图像一般为几兆到几十兆(分辨率为X000*X000),一般不会太大,但医学研究上电子切片等可以拍摄几万乘以几万分辨率的图像,图像转换为bmp可以达到几G。
前段时间遇到一个问题:一张JPG图像分辨率为33874*32185 深度为24,水平和竖直dpi为96,大小87.1mb,用目前流行的Adobe Photoshop,美图看看,画图版等都无法打开,因为我当前操作系统是64位 windows7,所以自带的图像查看软件可以打开,但载入的时间非常久而且占了6点多G,让我很头疼。
于是就想自己写个程序搞定这个图像。
用了FreeImage图像库来打开和保存图像,但在调用FreeImage_Load函数时,返回值为NULL,这个问题让我很困惑,寻找了很多方法还是没有解决,并且我的内存是8G的不存在不能分配的问题。后来查看了FreeImage的源代码,发现底层是malloc了一个bmp大小的内存,32位机器的总内存为2^31==4G,最大malloc为2G,而我图像需要内存为3.2G,所以一直Load不成功,我把程序换成了64位,编译器平台为VS2010,这个问题解决了,然后用FreeImage_Save保存了BMP图像。
但这么大的图像,一般看图软件还是不能打开,所以显示还是自己去完成。
基本想法是每次从文件中取响应于窗口大小的图像数据显示出来,这样就不用将整个图像载入内存中去了,整个源代码我放在了资源部分:http://download.csdn.net/detail/mcgradycom2/4596225。
简单的总结了一下这次问题的解决办法,希望这部分经验可以和大家分享。
程序只是个demo,存在部分bug,由于本人还有其他东西研究,也希望各位可以完善代码,共同进步。
ps:
本人最近在研究光场成像技术,如果有同方向的学者,可以加入新浪微群讨论:http://q.weibo.com/1036345;
附图:细胞图像,大分辨率图像;