2017-02-16 6 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을 읽어 알고 있다면

, 당신은, 당신이 PixelBuffer을 추출 할 수있는 WriteableBitmap에 이미지 파일을 읽기 BitmapEncoder로 인코딩, 수 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(); 
    } 
} 

이미지 목록은 하나씩 저장해야 할 수 있습니다.