Не только 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);