如何减少处理多个图像时使用的内存

本文关键字:内存 图像 何减少 处理 | 更新日期: 2023-09-27 17:59:55

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

  1. 它要求用户打开任意格式的多个图像
  2. 这些图像使用System.Drawing.Bitmap类存储在内存中,使用LockBits()方法,第一个像素数据的内存地址存储在字节*
  3. 新的System.Drawing.Bitmap是使用LockBits()方法和System.Threading.Tasks.Parallel类的不安全上下文中的直接内存访问创建和处理的,其像素值是使用每个像素的所有打开图像的像素值计算并保存到内存中的
  4. 已处理System.Drawing.Bitmap被编码为jpeg并保存到选定位置
  5. 调用Dispose()UnlockBits()C.Collect()法

问题是,使用上述方法,所有打开的图像都必须留在内存中,直到整个操作完成
例如,如果我打开分辨率为4160x3120的50个图像,它将占用4160*320*3*50字节:大约1857兆字节的内存。

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

如何减少处理多个图像时使用的内存

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

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

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

对不起,但我认为你的问题的直接答案是否定的。

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

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

更多的性能取决于你的算法允许你做什么。