2017-02-16 8 views
0

私はビットマップイメージのリストを持っています。私はそれらをローカルフォルダに保存する必要があります。 これは、Windows 10 Universalアプリケーションでは機能しません。ビットマップイメージのリストを保存する

var serializer = new DataContractSerializer(typeof(List<BitmapImage>)); 
    using (var stream = await ApplicationData.Current.LocalCacheFolder.OpenStreamForWriteAsync(fileName, CreationCollisionOption.ReplaceExisting)) { 
      serializer.WriteObject(stream, collection); 
     } 

writeObjectメソッドは、次のエラー

Exception thrown: 'System.Runtime.Serialization.InvalidDataContractException' in System.Private.DataContractSerialization.dll 
+0

「これは動作しません」 - 何のエラーが表示されていますか? –

+0

編集した質問を教えてください。ありがとう – cykopath

答えて

1

BitmapImageがシリアライズないスロー。それは、バイト配列に変換し、代わりにディスクにそれを書き込み:

public static byte[] ConvertToBytes(BitmapImage bitmapImage) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     var btmMap = new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight); 
     btmMap.SaveJpeg(ms, bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100); 
     return ms.ToArray(); 
    } 
} 

var serializer = new DataContractSerializer(typeof(byte[])); 
    using (var stream = await ApplicationData.Current.LocalCacheFolder.OpenStreamForWriteAsync(fileName, CreationCollisionOption.ReplaceExisting)) { 
     serializer.WriteObject(stream, ConvertToBytes(collection)); 
    } 
+0

どのようにビットマップイメージにバイトを変換するには? – cykopath

+0

また、WriteablebitmapにはJPEGの定義が含まれていません。 – cykopath

0

あなたはBitmapImageからビットマップを抽出することはできません。 BitmapImageを直接ファイルに保存する方法はありません。唯一の方法は、元のソースを覚えて、それを保存することです。ファイルへのBitmapImageの保存の詳細については、this threadを参照してください。

あなたは元のソースを知っている場合、たとえば、あなたがFileOpenPickerが選んだファイルからBitmapImageを読んで、あなたはWriteableBitmapに画像ファイルを読み込むことができ、あなたはBitmapEncoderでそれをエンコード、PixelBufferを抽出することができ、かつRobによると、得られたストリームをStorageFileに保存します。サンプルコードは次のとおりです。

private async void btncreate_Click(object sender, RoutedEventArgs e) 
{ 
    FileOpenPicker openpicker = new FileOpenPicker(); 
    openpicker.FileTypeFilter.Add(".jpg"); 
    openpicker.FileTypeFilter.Add(".png"); 
    StorageFile originalimage = await openpicker.PickSingleFileAsync(); 
    WriteableBitmap writeableimage1; 
    using (IRandomAccessStream stream = await originalimage.OpenAsync(FileAccessMode.Read)) 
    { 
     SoftwareBitmap softwareBitmap; 
     BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); 
     softwareBitmap = await decoder.GetSoftwareBitmapAsync(); 
     writeableimage1 = new WriteableBitmap(softwareBitmap.PixelWidth, softwareBitmap.PixelHeight); 
     writeableimage1.SetSource(stream); 
    } 
    StorageFolder folder = ApplicationData.Current.LocalFolder; 
    StorageFile newimage = await folder.CreateFileAsync(originalimage.Name, CreationCollisionOption.ReplaceExisting); 
    using (IRandomAccessStream ras = await newimage.OpenAsync(FileAccessMode.ReadWrite)) 
    { 
     BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, ras); 
     var stream = writeableimage1.PixelBuffer.AsStream(); 
     byte[] buffer = new byte[stream.Length]; 
     await stream.ReadAsync(buffer, 0, buffer.Length); 
     encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)writeableimage1.PixelWidth, (uint)writeableimage1.PixelHeight, 96.0, 96.0, buffer); 
     await encoder.FlushAsync(); 
    } 
} 

画像の一覧は、1つずつ保存する必要があります。

関連する問題