如何减少处理许多图像的内存使用量?

时间:2015-06-25 13:55:51

标签: c# wpf memory bitmap

我正在开发一个C#WPF应用程序,它使用来自许多图像的像素数据来处理一个图像。

  1. 它要求用户打开任何格式的多个图像。
  2. 使用 LockBits()方法在内存中使用 System.Drawing.Bitmap 类存储这些图像,并将其第一个像素数据的内存地址存储在字节* 即可。
  3. 使用 LockBits()方法创建和处理新的 System.Drawing.Bitmap ,并使用不安全上下文中直接进行内存访问System.Threading.Tasks.Parallel 类,其像素值使用每个像素的所有打开图像的像素值计算并保存到内存中。
  4. 已处理 System.Drawing.Bitmap 已编码为jpeg并保存到所选位置。
  5. Dispose() UnlockBits() GC.Collect()方法被调用。
  6. 问题在于,使用上述方法,所有打开的图像必须保留在存储器中,直到整个操作完成 例如,如果我打开分辨率为4160x3120的50张图像,则需要4160 * 3120 * 3 * 50字节:大约1857兆字节的内存。

    是否有任何可能的解决方案不需要所有图像都在内存中,或任何其他解决方案来减少内存使用?

2 个答案:

答案 0 :(得分:1)

我正在开发一个C#WPF应用程序,它使用来自许多图像的像素数据来处理一个图像。

如果您需要来自许多图像的像素数据,那么您需要它们在内存中。您无法直接从磁盘处理像素或从磁盘处理像素。您的方法应该是尽量减少所需的图像。

如果像素处理来自相同的相对位置,则可能将图像分成多个部分(例如四分之一)。

答案 1 :(得分:0)

很抱歉,但我认为你问题的直接答案是否定的。

如果您需要在运行时处理所有图像数据,则需要将所有图像数据都存储在内存中。在使用医学图像或图像处理算法进行3D渲染,模式识别等的某些应用中,这种情况非常普遍,这就是为什么这种系统通常需要很好的硬件才能运行的原因。

你在不安全的环境中做正确的事情,你应该尽可能多地使用TPL(任务并行库)。

更高的性能取决于您的算法允许您做什么。