我有一个 WPF 应用程序,我通过使用 TiffBitmapEncoder 将它们转换为 TIFF 图像来保存数百个 BitmapSource。但是,我有这种奇怪的内存消耗,它经常抛出内存不足异常。
笔记:
- 我安装了 8GB 的内存。
- 图像尺寸从 10x10 到 300x300 像素不等(非常小)
这是有效的代码:
static void SaveBitmapSource(BitmapSource bitmapSource)
{
TiffBitmapEncoder encoder = new TiffBitmapEncoder();
encoder.Compression = TiffCompressOption.Zip;
BitmapFrame frame = BitmapFrame.Create(bitmapSource);
encoder.Frames.Add(frame);
using (MemoryStream ms = new MemoryStream())
{
encoder.Save(ms);
}
}
这是我记忆的屏幕截图:
现在,如果我克隆 BitmapSource(即使只是一次),那么我会得到这个巨大的内存分配,导致内存不足异常。
static BitmapSource source2 = null;
static void SaveBitmapSource(BitmapSource bitmapSource)
{
if (source2 == null)
{
source2 = bitmapSource.Clone();
}
TiffBitmapEncoder encoder = new TiffBitmapEncoder();
encoder.Compression = TiffCompressOption.Zip;
BitmapFrame frame = BitmapFrame.Create(source2);
encoder.Frames.Add(frame);
using (MemoryStream ms = new MemoryStream())
{
encoder.Save(ms);
}
}
这是我对第二个代码示例的记忆截图
有谁知道这可能是什么原因以及如何解决它?
不同之处在于第一个示例中的 BitmapSource 已渲染到屏幕上,而第二个示例中没有。我的怀疑是这可能与 GPU 和调度程序有关,可能是硬件加速转换,而第二个是在 CPU 上完成的,存在某种错误......
试过:
- 在没有运气
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
之后尝试调用SaveBitmapSource()