UWP应用程序序列化ObservableCollection和图像

时间:2018-04-01 00:34:36

标签: uwp

我使用l并在那里存储l。试图使用Newtonsoft.Json序列化ObservableCollection,它只保存文本。想要以字节的形式保留图像,但尚未找到如何将BitmapImage转换为ObservableCollection

总的来说,我有两个问题:

  1. 是否要将BitmapImage个图像序列化为文件?
  2. 如何将Byte[]转换为字节数组?
  3. 该问题与UWP平台有关,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

是否要将ObservableCollection图像序列化为文件?

您无法从BitmapImage中提取位图。无法将其保存到文件中。

您可以使用WriteableBitmap代替BitmapImage,然后您可以获取WriteableBitmap的像素数据。

public static async Task<FileUpdateStatus> SaveToPngImage(this WriteableBitmap bitmap, PickerLocationId location, string fileName) 
{ 
    var savePicker = new FileSavePicker 
    { 
        SuggestedStartLocation = location 
    }; 
    savePicker.FileTypeChoices.Add("Png Image", new[] { ".png" }); 
    savePicker.SuggestedFileName = fileName; 
    StorageFile sFile = await savePicker.PickSaveFileAsync(); 
    if (sFile != null) 
    { 
        CachedFileManager.DeferUpdates(sFile); 


        using (var fileStream = await sFile.OpenAsync(FileAccessMode.ReadWrite)) 
        { 
            BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, fileStream); 
            Stream pixelStream = bitmap.PixelBuffer.AsStream(); 
            byte[] pixels = new byte[pixelStream.Length]; 
            await pixelStream.ReadAsync(pixels, 0, pixels.Length); 
            encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, 
                      (uint)bitmap.PixelWidth, 
                      (uint)bitmap.PixelHeight, 
                      96.0, 
                      96.0, 
                      pixels); 
            await encoder.FlushAsync(); 
        } 


        FileUpdateStatus status = await CachedFileManager.CompleteUpdatesAsync(sFile); 
        return status; 
    } 
    return FileUpdateStatus.Failed; 
} 
  

如何将BitmapImage转换为字节数组?

     

无法从ImageSource中提取图像数据。您需要跟踪信息的原始来源,并从原始源重新创建WriteableBitmap中的图像。如果您知道自己需要这样做,那么最好只使用WriteableBitmap作为ImageSource来开始

根据Rob的回复Convert ImageSource to WriteableBitmap in Metro Windows 8,无法将BitmapImage转换为字节数组。如果您使用过WriteableBitmap,则很容易做到。

private byte[] ImageToByeArray(WriteableBitmap wbp)  
{  
   using (Stream stream = wbp.PixelBuffer.AsStream())  
   using (MemoryStream memoryStream = new MemoryStream())  
   {  
      stream.CopyTo(memoryStream);  
      return memoryStream.ToArray();  
   }  
}