创造巨大的图像

时间:2010-04-24 10:56:45

标签: language-agnostic image memory-management

我的程序具有将工作画布的高分辨率图像导出到磁盘的功能。用户经常会尝试导出大约20,000 x 10,000像素@ 32bpp的图像,大约相当于800MB。将其添加到普通3D CAD程序中已经存在的严重内存消耗中,您几乎可以保证在32位平台上出现内存不足崩溃。

所以现在我正在导出1000x1000像素的图块,用户必须在像素编辑器中将其拼接在一起。有没有办法在没有用户做任何工作的情况下解决这个问题?

我想我可能会编写一个小的exe,它会在进程中执行命令并自动执行拼接。这将是一个单独的过程,因此它本身就有2GB的RAM。或者还有更好的方法吗?我想支持jpg,png和bmp,因此将图像作为字节流写入磁盘是不可能的。

2 个答案:

答案 0 :(得分:2)

ImageMagick有一个名为composite的组件。文档没有说明这个工具是否已经被构建为尽可能保持内存效率,但不应该花很长时间才能找到答案。下载页面为here。 IM可以在所有主要平台上使用,附带大量的API和接口,据我所知可以用作独立的EXE或DLL。

如果复合不适合你,我很确定还有其他工具。使用未压缩的图像数据可能最容易实现这一点 - 我想不出将4个JPEG拼接在一起而不将它们全部存储在内存中的方法(虽然我确信已经完成了)。

答案 1 :(得分:1)

如果你想要语言激动,那么你只有两个选择:

  • 要么像你做的那样做,要么
  • 将其作为专业图形 应用程序做到了。他们保持 磁盘上的图像全分辨率但是 加载/保存时,他们没有 立即加载/保存完整的图像 但在运行时创建这样的 内存中基于图块的方法(仅加载/保存当前相关的部分)。

第二种方法的缺点是你必须自己发展一切。您不能使用任何操作系统图像处理,图像编码/解码器或其他任何内容。

前段时间我遇到了类似的问题并且可以通过仅使用1 / 16bpp来解决它(特别是因为32位图像通常包含8个完全未使用的位,这些位不需要保存在内存中 - alpha通道)。这意味着我大部分都有1bpp图像层。但是,这显然只有在您使用自己的应用程序来使用图像时才有效。