将照片保存到班级

时间:2012-01-21 03:55:52

标签: windows-phone-7.1 windows-phone-7

我想将PhotoResultcameraCaptureTask保存到我的班级中,我将其作为收藏品使用,然后保存到隔离存储中:

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的示例,并且在示例中它工作正常,但它正在设置单独的独立存储,我只想加入我现有的集合。

我在想我不能使用Image类型。什么是完成我希望做的最好的方法?

回答下面的评论。这就是.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 个答案:

答案 0 :(得分:17)

我想我终于找到了你的问题。在你的ObservableCollection我个人不会在那里保留一个图像。相反,我会让BitmapSource使用更少的资源,但是你可能有理由为什么这样做。

我的流程

  1. 将Image.Source(BitmapSource)转换为byte []
  2. 将byte []保存到存储
  3. 从存储
  4. 加载字节[]
  5. 将byte []转换为Image.Source(BitmapSource)
  6. 将通用保存到隔离存储(在我的实用程序类中: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转换为byte [](在我的实用程序类中: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();
        }
    }
    

    将byte []转换为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,你需要使用CodePlex库或创建自己的PNGEncoder。

    我希望这有帮助!

答案 1 :(得分:2)

实际上在该博客中,他知道最近存储的ImageFileName,因此他能够从隔离存储中检索相同的图像。我不这么认为这个例子会根据你的评论帮助你。

但是如果你想将图片与对象一起存储意味着你必须将整个对象与所拍摄的图片序列化。

通过将您获得的流转换为 byte [] 数组来实现序列化图片,您可以再次从byte []数组转换为 BitmapImage 。)

Image conversion and serialization is expalianed here in this link

使用此示例,您可以使用整个对象进行序列化。

答案 2 :(得分:1)

在这个例子中,我除了你想要存储所有图像的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);
            }
        }
    }