Решение проблемы утечки памяти при загрузке большого изображения
При загрузке большого изображения в WriteableBitmap через LoadJpeg или Extensions.PictureDecoder, либо при загрузке в BitmapImage через SetSource(stream) , велика вероятность следующих проблем:
1. Возникновение Exception из-за нехватки памяти (memory leak)
2. Невозможность отобразить изображение полностью на Image Control
Как решить данную проблему? Во-первых, пользоваться стандартными средствами, не изобретая велосипед, во-вторых, уменьшать изображение при загрузке, чтобы с ним было проще работать.
WriteableBitmap wBitmap;
try
{
using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
using (IsolatedStorageFileStream fileStream = storage.OpenFile(file, FileMode.Open, FileAccess.ReadWrite))
{
if (fileStream.Length > 3145728) // 3 Мб, проще смотреть по размеру, а не разрешению, т.к. появтяся доп. сложности, а нам этого достаточно
{
wBitmap = PictureDecoder.DecodeJpeg(fileStream, 1500, 1500);
using (IsolatedStorageFileStream stream = LocalFile._FileStore.CreateFile("thumbImg.jpg"))
{
wBitmap.SaveJpeg(stream, wb.PixelWidth, wb.PixelHeight, 0, 80);
}
}
else
{
wBitmap = PictureDecoder.DecodeJpeg(fileStream);
}
}
}
catch (OutOfMemoryException ex)
{
MessageBox.Show("Нет больше памяти ;)");
}
img.Source = wBitmap;
При этом, при повторном открытии, стоит сразу открывать thumbImg.jpg, чтобы нет тратить доп ресурсы. Если изображение вам нужно лишь единожды, то и wBitmap.SaveJpeg делать смысла нет.