C# 如何存储大量可写位图?

C# 如何存储大量可写位图?,c#,wpf,writeablebitmap,writeablebitmapex,C#,Wpf,Writeablebitmap,Writeablebitmapex,我正在处理一组400多张图片,需要以不同的方式进行修改。最后,我需要有将近1500张图片。假设它们都是512*512px 我想首先应用这些修改,以便获得我的1500个图像,并将所有这些图像保存在一个列表中,以便在我的应用程序中快速访问这些图像(我希望能够在没有任何加载时间的情况下在图像之间切换) 要应用我的修改,我使用WriteableBitmapEx 问题是,为了能够修改它,我需要将这些图像渲染成WriteableBitmap,它会给我OutOfMemoryException 下面是我正在做的

我正在处理一组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);
        }
可能在我的“foreach”中,但我认为这将需要很多时间来加载


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

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

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

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

  • GC无法“收集”强引用的对象:在本例中,该对象包括列表中的所有可写位图。某种形式的磁盘缓存可能会证明..很有用,最小值为512x512x4x1500~1.6GB。当然,我只是在考虑收集“源”在我的每一次演讲中,虽然这可能会有所帮助,但似乎还不够。你是说使用某种数据库?GC会在需要时自动运行。你确定使用64位吗?
    GC.Collect();