2017-02-16 3 views
0

J'ai une liste d'images bitmap. Je dois les enregistrer dans un dossier local. Cela ne fonctionne pas sur l'application Windows 10 Universal.Enregistrement de la liste des images bitmap

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

méthode de WriteObject jette l'erreur suivante

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

"Cela ne fonctionne pas" - Quelle erreur obtenez-vous? –

+0

Veuillez voir la question éditée. Merci – cykopath

Répondre

1

BitmapImage non sérialisable. Convertir en un tableau d'octets et écrire que sur le disque à la place:

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

comment convertir les octets en image bitmap? – cykopath

+0

aussi Writeablebitmap ne contient pas de définition pour JPEG .. – cykopath

0

Vous ne pouvez pas extraire le bitmap à partir d'un BitmapImage. Il n'y a aucun moyen d'enregistrer un BitmapImage directement dans le fichier. Le seul moyen est de se souvenir de la source originale et de l'enregistrer. Pour plus de détails sur sauvegarder BitmapImage dans le fichier s'il vous plaît référence this thread.

Si vous connaissez la source d'origine, par exemple, vous lisez le BitmapImage du fichier choisi par un FileOpenPicker, vous pouvez lire le fichier d'image à un WriteableBitmap vous pouvez extraire le PixelBuffer, encoder avec un BitmapEncoder et puis enregistrer le flux résultant à un StorageFile comme Rob a dit. Exemple de code comme suit:

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(); 
    } 
} 

Pour la liste des images, vous devrez peut-être les enregistrer un par un.