Решение проблемы утечки памяти при загрузке большого изображения
При загрузке большого изображения в 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 делать смысла нет.