2

アプリ内で (CameraCaptureTask を使用して) 撮影した写真を分離ストレージに保存したいと考えています。現在の問題は、常にOutOfMemoryExceptionにつながる RAM の消費です。これは、画像を 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 です。例外を回避するために解像度を下げましたが、残念ながら遅延しました

4

1 に答える 1

3

解像度が 1600 * 1200 の 10 枚の写真は、約 80MB の RAM を使用します。メモリの制限は、Windows Phone 7 では 90 MB、Windows Phone 8 では 150 MB です。あなたがしようとしていることがうまくいく方法はありません。

私のアプリは最終的に 10 枚の写真を撮り、それらを分離ストレージに保存し、それらをイメージ コントロールに表示し、必要に応じて写真を完全に削除できるようになります。

このアプローチは正しいですが、サムネイルに表示するためにフルサイズの画像をロードしているため、RAM が完全に無駄になります。画像を分離ストレージに保存する場合は、解像度を下げてコピーを保存し、そのコピーをサムネイルに表示します。次に、ユーザーがサムネイルをタップすると、分離ストレージからフル解像度の画像が読み込まれ、表示されます。

于 2013-07-17T20:18:05.553 に答える