0

我正在处理一组 400 多张图像,我需要以不同的方式对其进行修改。最后,我需要有将近 1500 张图像。假设它们都是 512*512px

我想首先应用此修改以获得我的 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”中,但我认为这需要很长时间才能加载。

我读到的内容也让我觉得可能是我的做法不对,我应该考虑另一种方法。这就是我在这里发帖的原因,你们有什么建议吗?

4

1 回答 1

0

基本上,您不能在 32 位 .NET 进程的内存中存储超过 2GB 的内容。正如所指出的,这不是垃圾收集器 (GC) 问题,因为您通过将所有这些图像存储在List<T>. 垃圾收集器将为您的每个图像分配内存,当它处于“压力之下”时,它会尝试找到不再引用的对象,然后释放它们。但是,由于您似乎只是添加到列表中,因此压力只会增加:-(

据我所知,您有两个选择:

  1. 找到一种方法来减少每个图像需要分配的内存量。最明显的是减小大小,例如只缓存缩略图。其次是不要为每个源图像缓存 2 个图像!
  2. 尝试仅在请求图像时才延迟加载图像,并可能从列表中删除未使用的(视图之外)图像。现在您正在为滚动列表等创建自己的 WPF 可视化代码。
于 2016-02-11T05:38:06.157 回答