2017-02-16 7 views
0

У меня есть список растровых изображений. Мне нужно сохранить их в локальную папку. Это не работает в Windows 10 Universal application.Сохранение списка растровых изображений

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.

Если вы знаете оригинальный источник, к примеру, вы читали BitmapImage из файла подобран в FileOpenPicker, то вы можете прочитать файл образа на WriteableBitmap, то вы можете извлечь PixelBuffer, кодировать его с BitmapEncoder, и затем сохраните полученный поток до 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(); 
    } 
} 

Для просмотра списка изображений, вам может понадобиться сэкономить их по одному.

Смежные вопросы