【发布时间】:2016-02-11 04:25:15
【问题描述】:
我正在处理一组 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”中,但我认为这需要很长时间才能加载。
我读到的内容也让我觉得可能是我的做法不对,我应该考虑另一种方法。这就是我在这里发帖的原因,你们有什么建议吗?
【问题讨论】:
-
GC 不能“收集”强引用的对象:在这种情况下,包括列表中的 所有 WriteableBitmap。某种形式的磁盘缓存可能会被证明是有用的,因为 512x512x4x1500 ~ 1.6GB 最小。
-
当然,我只是想在我的 foreach 的每一轮都收集那个“源”
-
虽然这可能对某些人有所帮助,但似乎并没有“足够”帮助。
-
你的意思是使用某种数据库?
-
GC 会在需要时自动运行。您确定您使用的是 64 位吗?
标签: c# wpf writeablebitmap writeablebitmapex