gpt4 book ai didi

c# - TiffBitmapEncoder,在 C#/WPF 中导致内存不足异常的内存错误

转载 作者:行者123 更新时间:2023-11-30 22:08:52 24 4
gpt4 key购买 nike

我有一个 WPF 应用程序,我通过使用 TiffBitmapEncoder 将它们转换为 TIFF 图像来保存数百个 BitmapSources。但是,我有这种奇怪的内存消耗,它经常抛出内存不足异常。

注意:

  • 我安装了 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);
}
}

这是我内存中的屏幕截图:

No memory exception

现在,如果我克隆 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);
}
}

这是我对第二个代码示例的内存截图

Memory exception

有谁知道可能导致此问题的原因以及如何解决它?

区别在于第一个示例中的 BitmapSource 已经渲染到屏幕上,而第二个示例中还没有。我怀疑这可能与 GPU 和 Dispatcher 有关,后者可能是硬件加速转换,而第二个是在 CPU 上完成的,那里存在某种错误...

尝试过:

  • 尝试在 SaveBitmapSource() 之后调用 GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true); 但没有成功

最佳答案

你必须使用文件流来减少内存使用;

        BitmapDecoder decoder;
using (Stream appendToOutput = File.Open(files[0], FileMode.Open, FileAccess.Read, FileShare.Read))
{
decoder = BitmapDecoder.Create(appendToOutput, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
using (Stream output = File.Open(outputFile, FileMode.Create, FileAccess.Write))
{
TiffBitmapEncoder childEncoder = new TiffBitmapEncoder();
if(Path.GetExtension(files[0]).Replace(".", "") == ScanningImageFormat.Jpeg) {
childEncoder.Compression = TiffCompressOption.Zip;
} else {
childEncoder.Compression = TiffCompressOption.Ccitt4;
}

foreach (BitmapFrame frm in decoder.Frames)
{
childEncoder.Frames.Add(frm);
}

List<Stream> imageStreams = new List<Stream>();
try
{
for (int i = 1; i < files.Count; i++)
{
string sFile = files[i];
BitmapFrame bmp = null;
Stream original = File.Open(sFile, FileMode.Open, FileAccess.Read);
imageStreams.Add(original);
bmp = BitmapFrame.Create(original, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
childEncoder.Frames.Add(bmp);
}
childEncoder.Save(output);
}
finally
{
try
{
foreach (Stream s in imageStreams)
{
s.Close();
}
}
catch { }
}
}
}
decoder = null;

关于c# - TiffBitmapEncoder,在 C#/WPF 中导致内存不足异常的内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21992799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com