我开发了一个WPF应用程序,使用BitmapDecoder
来保存图像。保存图像时,我得到了
内存不足以完成操作异常。
代码看起来像这样:
BitmapDecoder imgDecoder = BitmapDecoder.Create(mem,
BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.None);
我认为BitmapDecoder对象可能是该异常的原因;我该如何处置这个物体?
答案 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将完成它的工作并在需要时收集未使用的内存。