Недостаточно памяти в wp7 - PullRequest
1 голос
/ 18 января 2012

Я хочу создать приложение, которое будет захватывать изображения с помощью камеры и сохранять его в изолированном хранилище телефона. Однако я могу хранить 7 изображений при каждом запуске (т.е. каждый раз, когда активируется эмулятор) и для восемь изображений, которые я записываю и сохраняю, я получаю исключение нехватки памяти. Если мне нужно хранить больше изображений в изолированном хранилище, я должен прекратить отладку и перезапустить отладку. для отладки. Пожалуйста, помогите

    Stream doc_photo;
    List<document> doc_list = new List<document>();
    document newDoc = new document();
    public Page2()
    {
        InitializeComponent();
    }


    private void captureDocumentImage(object sender, RoutedEventArgs e)
    {
        ShowCameraCaptureTask();
    }

    private void ShowCameraCaptureTask()
    {
        CameraCaptureTask photoCameraCapture = new CameraCaptureTask();
        photoCameraCapture = new CameraCaptureTask();
        photoCameraCapture.Completed += new EventHandler<PhotoResult>photoCameraCapture_Completed);
        photoCameraCapture.Show();
    }

    void photoCameraCapture_Completed(object sender, PhotoResult e)
    {
        if (e.TaskResult == TaskResult.OK)
        {
            capturedImage.Source = PictureDecoder.DecodeJpeg(e.ChosenPhoto);
            doc_photo = e.ChosenPhoto;

        }
    }

    private void SaveToIsolatedStorage(Stream imageStream, string fileName)
    {
        using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (myIsolatedStorage.FileExists(fileName))
            {
                myIsolatedStorage.DeleteFile(fileName);
            }

            IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(fileName);
            BitmapImage bitmap = new BitmapImage();
            bitmap.SetSource(imageStream);
            try
            {
                WriteableBitmap wb = new WriteableBitmap(bitmap);
                wb.SaveJpeg(fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
                fileStream.Close();
            }
            catch (OutOfMemoryException e1)
            {
                MessageBox.Show("memory exceeded");
            }

        }
    }

    private void save_buttonclicked(object sender, RoutedEventArgs e)
    {

        if (namebox.Text != "" && doc_photo!=null)
        {

            newDoc.doc_name = namebox.Text;

            IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
            if(!myIsolatedStorage.DirectoryExists(App.current_panorama_page))
            {
               myIsolatedStorage.CreateDirectory(App.current_panorama_page);
            }
            newDoc.photo = App.current_panorama_page + "/" + namebox.Text + ".jpg";//
            SaveToIsolatedStorage(doc_photo, newDoc.photo);

            doc_list.Add(newDoc);
            NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));

        }
        else
        {
            if (namebox.Text == "")
            {
                MessageBox.Show("Enter the name");
            }
            else if (doc_photo == null) 
            {
                MessageBox.Show("Capture an Image");
            }

        }
    }

1 Ответ

3 голосов
/ 18 января 2012

вы сохраняете растровое изображение в 'doc_list', а не просто в URL, поэтому в телефоне каждое изображение будет сохраняться в памяти. Вероятно, вам следует найти решение, в котором на изображения ссылаются в пользовательском интерфейсе, используя обычные элементы управления изображениями и URL-адреса «isostore: //».

РЕДАКТИРОВАТЬ:

В приведенном ниже примере я использую ObservableCollection для хранения IsoImageWrappers. Последний класс обрабатывает соединение с изолированным хранилищем, создавая экземпляр изолированного потока файлов с URI, указанным в конструкторе.

ObservableCollection уведомит платформу WP7 о добавлении новых изображений. Хранение изображений почти как ваше первоначальное предложение.

Привязка списка:

 <ListBox Grid.Row="0" Height="495" Margin="0" Name="listBox1" Width="460" >
    <ListBox.ItemTemplate>
       <DataTemplate>
          <Image Source="{Binding Source}" Width="Auto" />
       </DataTemplate>
    </ListBox.ItemTemplate>
 </ListBox>

и код с уродливыми встроенными классами помощников и т. Д .:

using System;
using System.Collections.ObjectModel;
using System.IO;
using System.IO.IsolatedStorage;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;

namespace WP7Photo
{
    public partial class MainPage : PhoneApplicationPage
    {
        public class IsoImageWrapper
        {
            public string Uri { get; set; }

            public ImageSource Source
            {
                get
                {
                    IsolatedStorageFile isostore = IsolatedStorageFile.GetUserStoreForApplication();
                    var bmi = new BitmapImage();
                    bmi.SetSource(isostore.OpenFile(Uri, FileMode.Open, FileAccess.Read));
                    return bmi;
                }
            }
        }

        public ObservableCollection<IsoImageWrapper> Images { get; set; }

        // Constructor
        public MainPage()
        {
            InitializeComponent();
            Images = new ObservableCollection<IsoImageWrapper>();
            listBox1.ItemsSource = Images;
        }

        private void Button1Click(object sender, RoutedEventArgs e)
        {
            var cameraTask = new CameraCaptureTask();
            cameraTask.Completed += new EventHandler<PhotoResult>(cameraTask_Completed);
            cameraTask.Show();
        }

        void cameraTask_Completed(object sender, PhotoResult e)
        {
            if (e.TaskResult != TaskResult.OK)
            {
                return;
            }

            StorePhoto(e);
        }

        private void StorePhoto(PhotoResult photo)
        {
            IsolatedStorageFile isostore = IsolatedStorageFile.GetUserStoreForApplication();
            if (!isostore.DirectoryExists("photos"))
            {
                isostore.CreateDirectory("photos");
            }

            var filename = "photos/"  + System.IO.Path.GetFileName(photo.OriginalFileName);

            if (isostore.FileExists(filename)) { isostore.DeleteFile(filename);}

            using (var isoStream = isostore.CreateFile(filename))
            {
                photo.ChosenPhoto.CopyTo(isoStream);
            }
            Images.Add(new IsoImageWrapper {Uri = filename});
        }
    }
}
...