如何在wpf应用程序中处理BitmapDecoder对象

时间:2009-06-04 07:12:59

标签: c# wpf

我开发了一个WPF应用程序,使用BitmapDecoder来保存图像。保存图像时,我得到了

  

内存不足以完成操作异常。

代码看起来像这样:

BitmapDecoder imgDecoder = BitmapDecoder.Create(mem,
BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.None);

我认为BitmapDecoder对象可能是该异常的原因;我该如何处置这个物体?

3 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。我有一个应用程序,使用BitmapDecoder加载数千个图像,并遇到内存问题。我必须创建一个包装类ImageFileHandler来处理与BitmapDecoder的所有交互,然后我将我的BitmapDecoder实例存储在WeakReference中。因此,如果操作系统需要内存,我的弱引用将放弃BitmapDecoder,然后每次我的ImageFileHandler需要它时,如果需要,它将创建一个新的。

答案 1 :(得分:2)

不仅BmpBitmapDecoder,而且所有解码器(GifBitmapDecoder,PngBitmapDecoder,JpegBitmapDecoder,TiffBitmapDecoder)都不是一次性类,所以你可以做的只是说

_myDecoder = null; 
GC.Collect();

让垃圾收集器完成它的工作。

如果您愿意,可以创建一个BitmapDecoder的池,并将图像加载为FileStream,这些图像是一次性的并包含图像的二进制数据。也许下面的代码给你一个想法:

GC.Collect();
// Load the file stream if it hasn't been loaded yet
if (_imageDataStream == null)
    _imageDataStream = new FileStream(_imagePath, FileMode.Open, FileAccess.Read, FileShare.Read);
else
    _imageDataStream.Seek(0, SeekOrigin.Begin);

string extension = System.IO.Path.GetExtension(_imagePath).ToUpper();
if (extension.Contains("GIF"))
    _decoder = new GifBitmapDecoder(_imageDataStream, BitmapCreateOptions.PreservePixelFormat,
        BitmapCacheOption.OnDemand);
else if (extension.Contains("PNG"))
    _decoder = new PngBitmapDecoder(_imageDataStream, BitmapCreateOptions.PreservePixelFormat,
        BitmapCacheOption.OnDemand);
else if (extension.Contains("JPG") || extension.Contains("JPEG"))
    _decoder = new JpegBitmapDecoder(_imageDataStream, BitmapCreateOptions.PreservePixelFormat,
        BitmapCacheOption.OnDemand);
else if (extension.Contains("BMP"))
    _decoder = new BmpBitmapDecoder(_imageDataStream, BitmapCreateOptions.PreservePixelFormat,
        BitmapCacheOption.OnDemand);
else if (extension.Contains("TIF"))
    _decoder = new TiffBitmapDecoder(_imageDataStream, BitmapCreateOptions.PreservePixelFormat,
        BitmapCacheOption.OnDemand);

答案 2 :(得分:1)

BitmapDecoder不是一次性的。如果你不再需要它,请确保你没有保留对BitmapDecoder的任何引用,GC将完成它的工作并在需要时收集未使用的内存。