Сохранение фотографий (CameraCaptureTask) в изолированном хранилище - OutOfMemoryException
Я хотел бы сохранить фотографию, сделанную в моем приложении (с помощью CameraCaptureTask), в изолированное хранилище. Текущая проблема - потребление оперативной памяти, которое всегда приводит к исключению OutOfMemoryException. Это также происходит, когда я загружаю изображение в Image-Control.
Мое приложение должно, наконец, иметь возможность делать 10 снимков, сохранять их в изолированном хранилище, показывать их в элементе управления изображениями и, при необходимости, удалять изображение навсегда.
Понижение разрешения изображений логически исправило исключение, но я не хотел этого делать.
Может быть, вы можете дать мне подсказку.
Вот мой код:
private CameraCaptureTask ccTask = new CameraCaptureTask();
WriteableBitmap[] imgList = new WriteableBitmap[10];
Random rnd = new Random();
private void addPicture_button_Click(object sender, EventArgs e)
{
ccTask.Show();
ccTask.Completed += ccTask_Completed;
}
void ccTask_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
WriteableBitmap writeableBitmap = new WriteableBitmap(1600,1200);
writeableBitmap.LoadJpeg(e.ChosenPhoto);
string imageFolder = "Unfaelle";
string datetime = DateTime.Now.ToString().Replace("/","");
datetime = datetime.Replace(":","");
string imageFileName = "Foto_"+datetime+".jpg";
using (var isoFile = IsolatedStorageFile.GetUserStoreForApplication())
{
if (!isoFile.DirectoryExists(imageFolder))
{
isoFile.CreateDirectory(imageFolder);
}
string filePath = System.IO.Path.Combine(imageFolder, imageFileName);
using (var stream = isoFile.CreateFile(filePath))
{
writeableBitmap.SaveJpeg(stream, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 100);
}
}
//now read the image back from storage to show it worked...
BitmapImage imageFromStorage = new BitmapImage();
using (var isoFile = IsolatedStorageFile.GetUserStoreForApplication())
{
string filePath = System.IO.Path.Combine(imageFolder, imageFileName);
using (var imageStream = isoFile.OpenFile(
filePath, FileMode.Open, FileAccess.Read))
{
imageFromStorage.SetSource(imageStream);
}
}
Rectangle b = new Rectangle()
{
Width = 100,
Height = 100,
};
Thickness margin = b.Margin;
margin.Left = 10;
margin.Top = 10;
b.Margin = margin;
ImageBrush imgBrush = new ImageBrush();
imgBrush.ImageSource = imageFromStorage;
b.Fill = imgBrush;
b.Tag = System.IO.Path.Combine(imageFolder, imageFileName);
b.Tap += OnTapped;
pictures_wrapPanel.Children.Add(b);
}
}
private void OnTapped(object sender, System.Windows.Input.GestureEventArgs e)
{
Rectangle r = sender as Rectangle;
BitmapImage imageFromStorage = new BitmapImage();
using (var isoFile = IsolatedStorageFile.GetUserStoreForApplication())
{
string filePath = r.Tag.ToString();
using (var imageStream = isoFile.OpenFile(
filePath, FileMode.Open, FileAccess.Read))
{
imageFromStorage.SetSource(imageStream);
}
}
img.Source = imageFromStorage;
}
Большое спасибо, если есть что-то непонятное, не стесняйтесь спрашивать. Может быть, есть гораздо более простой способ сохранить фотографию, я только начинаю с разработки приложений Привет Даниэль
Кстати: 1600x1200 2MP, я уменьшил разрешение, чтобы избежать исключения, к сожалению, это было просто отложено
1 ответ
10 снимков с разрешением 1600 * 1200 используют около 80 МБ ОЗУ. Ограничение памяти составляет 90 МБ в Windows Phone 7 и 150 МБ в Windows Phone 8, и то, что вы пытаетесь сделать, не сработает.
Мое приложение должно, наконец, иметь возможность делать 10 снимков, сохранять их в изолированном хранилище, показывать их в элементе управления изображениями и, если необходимо, удалять снимки навсегда.
Этот подход верен, однако вы загружаете полноразмерное изображение для отображения в миниатюрах, что является полной тратой оперативной памяти. При сохранении изображения в изолированном хранилище сохраните копию с более низким разрешением и отобразите эту копию в виде миниатюры. Затем, когда пользователь нажмет на миниатюру, загрузите изображение в полном разрешении из изолированного хранилища, чтобы отобразить его.