Сохранение фотографии в классе - PullRequest
9 голосов
/ 21 января 2012

Я хотел бы сохранить PhotoResult из cameraCaptureTask в своем классе, который я использую в качестве коллекции, а затем сохранить в изолированном хранилище:

void cameraCaptureTask_Completed(object sender, PhotoResult e)

Это часть ObservableCollection. Я хочу сохранить фотографию в этой коллекции.

[DataMember]
public Image VehicleImage
{
   get
   {
      return _vehicleImage;
   }
   set
   {
      if (value != _vehicleImage)
      {
         _vehicleImage = value;
         NotifyPropertyChanged("VehicleImage");
      }
   }
}

Я использую пример из: http://www.blog.ingenuitynow.net, и в примере он работает нормально, но он настраивает отдельное изолированное хранилище, и я просто хотел бы присоединиться к моей существующей коллекции.

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

Просто чтобы ответить на комментарий ниже. Вот что делает .Save:

public static void Save<T>(string name, T objectToSave)
{
    using (IsolatedStorageFile storageFile = IsolatedStorageFile.GetUserStoreForApplication())
    using (IsolatedStorageFileStream storageFileStream = new IsolatedStorageFileStream(name, System.IO.FileMode.Create, storageFile))
    {
        DataContractSerializer serializer = new DataContractSerializer(typeof(T));
        serializer.WriteObject(storageFileStream, objectToSave);
    }
}

Ответы [ 3 ]

17 голосов
/ 24 января 2012

Думаю, я наконец понял вашу проблему. В вашей коллекции ObservableCollection я бы не стал хранить изображение. Вместо этого я бы оставил BitmapSource для использования меньшего количества ресурсов, однако у вас могут быть причины, почему вы это делаете.

Мой процесс

  1. Преобразование Image.Source (BitmapSource) в байт []
  2. Сохранить байт [] в хранилище
  3. Загрузить байт [] из хранилища
  4. Преобразование байта [] в и Image.Source (BitmapSource)

Сохранить общий вид в изолированном хранилище (в моем служебном классе: IsolatedStorage_Utility.cs)

public static void Save<T>(string fileName, T item)
{
    using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(fileName, FileMode.Create, storage))
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(T));
            serializer.WriteObject(fileStream, item);
        }
    }
}

Загрузка общего хранилища в изолированное хранилище (в моем служебном классе: IsolatedStorage_Utility.cs)

public static T Load<T>(string fileName)
{
    using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(fileName, FileMode.Open, storage))
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(T));
            return (T)serializer.ReadObject(fileStream);
        }
    }
}

Преобразовать BitmapSource в байт [] (в моем служебном классе: Image_Utility.cs)

public static byte[] ImageToByteArray(BitmapSource bitmapSource)
{
    using (MemoryStream stream = new MemoryStream())
    {
        WriteableBitmap writableBitmap = new WriteableBitmap(bitmapSource);
        Extensions.SaveJpeg(writableBitmap, stream, bitmapSource.PixelWidth, bitmapSource.PixelHeight, 0, 100);

        return stream.ToArray();
    }
}

Преобразовать байт [] в BitmapSource (в моем служебном классе: Image_Utility.cs)

public static BitmapSource ByteArrayToImage(byte[] bytes)
{
    BitmapImage bitmapImage = null;
    using (MemoryStream stream = new MemoryStream(bytes, 0, bytes.Length))
    {
        bitmapImage = new BitmapImage();
        bitmapImage.SetSource(stream);
    }

    return bitmapImage;
}

Пример

private void TestImageConversion(object sender, RoutedEventArgs e)
{
    byte[] image1AsByteArray = Image_Utility.ImageToByteArray((BitmapSource)Image1.Source);
    IsolatedStorage_Utility.Save<byte[]>("Image1.jpg", image1AsByteArray);

    BitmapSource image1AsBitmapImage = Image_Utility.ByteArrayToImage(IsolatedStorage_Utility.Load<byte[]>("Image1.jpg"));
    Image2.Source = image1AsBitmapImage;
}

Имейте в виду, что это jpg экономия. Если вы хотите сохранить png thn, вам нужно использовать библиотеку CodePlex или создать свой собственный PNGEncoder.

Надеюсь, это поможет!

2 голосов
/ 23 января 2012

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

Но если вы хотите сохранить изображение вместе с объектом, это означает, что вы должны сериализовать весь объект вместе с полученным снимком.

Сериализация изображения достигается путем преобразования полученного вами потока в массив byte [] , и вы можете преобразовать массив байтов [] в BitmapImage снова.)

Преобразование и сериализация изображений здесь объяснены по этой ссылке

используйте этот пример, и вы можете сериализовать весь объект.

1 голос
/ 21 января 2012

В этом примере я исключаю, что у вас есть ObservableCollection, где вы хотите сохранить все изображения, скажем, его имя - VehicleImages.

Таким образом, в cameraCaptureTask_Completed вы загружаете все данные из IsolatedStorage в VehicleImages, а теперь добавляете новый VehicleImage в VehicleImages и сохраняете его в IsolatedStorage.

Код для сохранения и загрузки:

            public static void Save<T>(string name, T objectToSave)
    {
        using (IsolatedStorageFile storageFile = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream storageFileStream = new IsolatedStorageFileStream(name, System.IO.FileMode.Create, storageFile))
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                serializer.WriteObject(storageFileStream, objectToSave);
            }
        }
    }
    public ObservableCollection<T> Read<T>(string name)
    {
        using (IsolatedStorageFile storageFile = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream storageFileStream = new IsolatedStorageFileStream(name, System.IO.FileMode.Open, storageFile))
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                return (ObservableCollection<T>)serializer.ReadObject(storageFileStream);
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...