如何存储大量的可写位图
本文关键字:位图 何存储 存储 | 更新日期: 2023-09-27 18:34:05
我正在使用一组 400+ 张图像,我需要以不同的方式修改它们。最后,我需要有近 1500 张图像。假设它们都是 512*512 像素
我想首先应用此修改以获取我的 1500 张图像,并将所有这些图像保存在列表中,以便在我的应用程序中快速访问它(我希望能够在没有任何加载时间的情况下在图像之间切换(
为了应用我的修改,我使用WriteableBitmapEx。
问题是,为了能够修改它,我需要将此图像渲染成 WriteableBitmap,它给了我 OutOfMemoryException。
这是我正在做的事情的简化示例:
List<WriteableBitmap> myList = new List<WriteableBitmap>();
foreach (var image in mySetOfImages) // iterating on my set of 400+ images
{
WriteableBitmap source = image.RenderImage().As<WriteableBitmap>();
WriteableBitmap dest1 = BitmapFactory.New(512, 512);
WriteableBitmap dest2 = BitmapFactory.New(512, 512);
[...] // Some lines modifying dest1 and dest2 using source
myList.Add(dest1);
myList.Add(dest2);
}
我读了很多关于这个例外的信息。我读到我可以添加
GC.Collect();
可能在我的"foreach"内,但我认为这将需要很长时间才能加载。
我读到的内容也让我觉得可能是我做得不正确,我应该想出另一种方法来做到这一点。这就是我在这里发帖的原因,你们有什么提示吗?
基本上,您不能在 32 位 .NET 进程的内存中存储超过 2GB 的内容。如前所述,这不是垃圾收集器(GC(问题,因为您通过将所有这些图像存储在List<T>
中来强烈引用所有这些图像。垃圾回收器将为每个图像分配内存,当它"处于压力之下"时,将尝试查找不再引用的对象,然后释放它们。但是,由于您似乎只是添加到列表中,因此压力只会增加:-(
据我所知,您有两种选择:
- 找到一种方法来减少每个图像需要分配的内存量。最明显的是减小大小,例如仅缓存缩略图。其次是不要为每个源图像缓存 2 张图像!
- 尝试仅在请求图像时延迟加载图像,并可能从列表中删除未使用的(视图外(图像。现在,您正在创建自己的WPF可视化代码,用于滚动列表等。