Загрузка изображения из памяти в Windows Phone

Я хотел бы иметь возможность сделать снимок, отобразить его и сохранить местоположение, чтобы я мог сохранить его в записи и иметь возможность отобразить его позже.

Я смог отобразить это нормально, используя код

BitmapImage bmp = newBitmapImage();
bmp.SetSource(e.ChosenPhoto);
myImage.Source = bmp2;

Когда myImage — отображаемое изображение, а e — объект PhotoResult. Однако, поскольку мне нужно сохранить это в записи, я попытался использовать этот код для отображения фотографии в зависимости от местоположения.

string imageLoc = e.OriginalFileName;
Uri imageUri = new Uri(imageLoc, UriKind.Relative);
StreamResourceInfo resourceInfo = Application.GetResourceStream(imageUri);
BitmapImage bmp = BitmapImage();
bmp.SetSource(resourceInfo.Stream);
myImage.Source = bmp;

Когда я запускаю этот код, я получаю исключение System.NullReferenceException. Я предполагаю, что это связано с Application.GetResourceStream, но я просто не уверен, что происходит не так.

Для пояснения, я хотел бы иметь возможность загружать и отображать фотографию из такого места, как «C:\Data\Users\Public\Pictures\Camera Roll\imageExample.jpg».


person Starktastic    schedule 04.02.2014    source источник


Ответы (2)


если вы хотите сохранить изображение на устройстве с Windows Phone, вам необходимо использовать файл IsolatedStorage. Сохранить изображение =>

            String tempJPEG = "logo.jpg";

            // Create virtual store and file stream. Check for duplicate tempJPEG files.
            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (myIsolatedStorage.FileExists(tempJPEG))
                {
                    myIsolatedStorage.DeleteFile(tempJPEG);
                }

                IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(tempJPEG);


                StreamResourceInfo sri = null;
                Uri uri = new Uri(tempJPEG, UriKind.Relative);
                sri = Application.GetResourceStream(uri);

                BitmapImage bitmap = new BitmapImage();
                bitmap.SetSource(sri.Stream);
                WriteableBitmap wb = new WriteableBitmap(bitmap);

                // Encode WriteableBitmap object to a JPEG stream.
                Extensions.SaveJpeg(wb, fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);

                //wb.SaveJpeg(fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
                fileStream.Close();
            }

Читать изображение =>

BitmapImage bi = new BitmapImage();

            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile("logo.jpg", FileMode.Open, FileAccess.Read))
                {
                    bi.SetSource(fileStream);
                    this.img.Height = bi.PixelHeight;
                    this.img.Width = bi.PixelWidth;
                }
            }
            this.img.Source = bi;
person MatDev8    schedule 04.02.2014
comment
Моя фотография автоматически сохраняется в фотопленке по адресу «C:\Data\Users\Public\Pictures\Camera Roll\imageExample.jpg», нужен ли первый блок кода? - person Starktastic; 04.02.2014
comment
Windows Phone или Windows 8. Вы не можете получить доступ к изображению по этому пути, когда используете Windows Phone. Когда вы делаете снимок с помощью своего кода приложения, изображение сохраняется по этому пути «C:\Data\Users\Public\Pictures\Camera Roll\imageExample.jpg»? - person MatDev8; 04.02.2014
comment
Просто для проверки сделайте так: string imageLoc = e.OriginalFileName; Uri imageUri = новый Uri (imageLoc, UriKind.Relative); StreamResourceInfo resourceInfo = Application.GetResourceStream(imageUri); BitmapImage bmp = BitmapImage(); bmp.UriSource = imageUri; myImage.Source = bmp; - person MatDev8; 04.02.2014

Если вы хотите получить изображения из MediaLibrary (Camera roll, Saved Pictures ..), то вы можете выполнить свою задачу:

Ваш код может выглядеть, например, так (я отредактировал его, чтобы использовать только изображения из фотопленки):
Вы получаете поток изображений с помощью строки picture.GetImage() — этот метод возвращает Stream, который вы можете использовать, например, для скопировать в изолированное хранилище.

private void MyImg()
{
    using (MediaLibrary mediaLibrary = new MediaLibrary())
       foreach (PictureAlbum album in mediaLibrary.RootPictureAlbum.Albums)
       {
           if (album.Name == "Camera Roll")
           {
             PictureCollection pictures = album.Pictures;
             foreach (Picture picture in pictures)
             {
                 // example how to use it as BitmapImage
                 // BitmapImage image = new BitmapImage();
                 // image.SetSource(picture.GetImage()); 
                 // I've commented that above out, as you can get Memory Exception if
                 // you try to read all pictures to memory and not handle it properly.

                 // Example how to copy to IsolatedStorage
                 using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
                 {
                    if (!storage.DirectoryExists("SavedImg"))
                        storage.CreateDirectory("SavedImg");

                    if (storage.FileExists("SavedImg" + @"\" + picture.Name))
                        storage.DeleteFile("SavedImg" + @"\" + picture.Name);
                    using (IsolatedStorageFileStream file = storage.CreateFile("SavedImg" + @"\" + picture.Name))
                        picture.GetImage().CopyTo(file);
                 }
              }
           }
       }
}
person Romasz    schedule 04.02.2014