如何存储很多WriteableBitmap?

时间:2016-02-11 04:25:16

标签: c# wpf writeablebitmap writeablebitmapex

我正在使用一组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();

可能在我的&#39; foreach&#39;内部,但我认为这需要花费很多时间来加载。

我读到的内容也让我觉得可能是我没有以正确的方式做到这一点,我应该想到另一种方法。这就是我在这里发帖的原因,你们有什么提示吗?

1 个答案:

答案 0 :(得分:0)

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

我可以看到两个选项:

  1. 找到一种方法来减少每个图像分配所需的内存量。最明显的是减小尺寸,例如只缓存缩略图。第二是不为每个源图像缓存2个图像!
  2. 尝试仅在请求图像时延迟加载图像,并可能从列表中删除未使用(不在视图中)的图像。现在,您将创建自己的WPF Visualization代码以滚动列表等。