2010-04-24 83 views
0

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

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

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

回答

1

如果你想这样做的语言,激动,那么你只有两个选择:

  • 要么是因为你做了或者
  • 做的专业图形 应用做到这一点。他们保持 图像磁盘上的全分辨率,但 当加载/保存他们不 一次加载/保存整个图像 但在运行时在内存中创建这样一个 基于磁贴的方法(只加载/保存目前相关的零件)。

第二个问题的缺点是你必须自己开发一切。您不能使用任何操作系统图像处理,图像编/解码器或其他任何东西。

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

2

ImageMagick有一个名为composite的组件。文档没有提到这个工具是否已经尽可能提高内存效率,但是不应该花很长时间才能发现。下载页面是here。即时消息在所有主要平台上均可用,随附大量的API和接口,并且据我所知可以用作独立的EXE或DLL。

如果复合材料不适合你,我敢肯定还有其他工具。这对于未压缩的图像数据可能是最容易实现的 - 我想不出将4个JPEG拼接在一起而不将所有JPEG存储在内存中的方法(尽管我相信这一切已经完成)。

+0

谢谢佩卡,我会检查出复合功能。我将无法使用我的安装程序发布ImageMagick,因此直接使用它们的功能已无法使用。 – 2010-04-24 11:14:05

+0

@大卫不客气。但是如果你甚至不能发布外部的DLL,那么你肯定会推出自己的智能拼接/交换解决方案 - 这当然不是不可能的,而是一个坚强的破解!我确信有很多开源的拼接器可以获得至少灵感。 – 2010-04-24 11:48:42

+0

我写了一个小的控制台应用程序,可以自动运行。这个过程不需要太长时间,但它仍然限制在32位操作系统上的2GB未压缩的图像数据。不过,我认为大多数用途都应该没问题。 – 2010-04-24 13:58:51