Сохранение фотографий (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 снимков, сохранять их в изолированном хранилище, показывать их в элементе управления изображениями и, если необходимо, удалять снимки навсегда.

Этот подход верен, однако вы загружаете полноразмерное изображение для отображения в миниатюрах, что является полной тратой оперативной памяти. При сохранении изображения в изолированном хранилище сохраните копию с более низким разрешением и отобразите эту копию в виде миниатюры. Затем, когда пользователь нажмет на миниатюру, загрузите изображение в полном разрешении из изолированного хранилища, чтобы отобразить его.

Другие вопросы по тегам