[ Windows Phone ] Memory Leak of WriteableBitmap in PictureDecoder

Решение проблемы утечки памяти при загрузке большого изображения

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *