首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何存储大量的WriteableBitmap?

如何存储大量的WriteableBitmap?
EN

Stack Overflow用户
提问于 2016-02-11 12:25:16
回答 1查看 126关注 0票数 0

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

我想首先应用这个修改,以便获得我的1500张图像,并将所有这些图像保存在一个列表中,以便在我的应用程序中快速访问它(我希望能够在不需要任何加载时间的情况下在图像之间切换)

要应用我的修改,我使用WriteableBitmapEx。

问题是,为了能够修改它,我需要将这个图像渲染到WriteableBitmap中,它给我提供了OutOfMemoryException。

下面是我正在做的一个简化示例:

代码语言:javascript
复制
        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);
        }

我读了很多关于这个异常的东西。我读到我可以加上

代码语言:javascript
复制
GC.Collect();

可能在我的“foreach”中,但我认为这将需要很长时间才能加载。

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

EN

回答 1

Stack Overflow用户

发布于 2016-02-11 13:38:06

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

在我看来,你有两个选择:

  1. 找到了一种方法来减少每个映像所需分配的内存量。最明显的是减小大小,例如只缓存缩略图。第二是不为每个源图像缓存2个图像!
  2. 尝试仅在请求图像时延迟加载图像,并可能将未使用的图像从列表中删除(看不到)。现在,您可以创建自己的WPF可视化代码,用于滚动列表等。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35330766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档