2016-08-16 6 views
1

У меня есть следующий код, и я не вижу ничего плохого, никаких идей о том, что может быть проблемой?BitmapEncoder Сохранение не поддерживается

private static string SaveBaseImage(ZipArchive arc, DBImage image, int imageIndex) 
{ 
    using (var mem = new MemoryStream(image.Data)) 
    { 
     var bmp = BitmapFrame.Create(mem); 
     //var bmp = BitmapFrame.Create(m‌​em, BitmapCreateOptions.‌​None, BitmapCacheOption.On‌​Load); 
     var codex = bmp.Decoder.CodecInfo; 

     var filename = $"{imageIndex}{codex.FileExtensions}"; 
     var imagezip = arc.CreateEntry(filename,CompressionLevel.Optimal)); 
     using (var imagestream = imagezip.Open()) 
     { 
      SaveImage(bmp, imagestream); 
     } 
     return filename; 
    } 
} 

private static void SaveImage(BitmapFrame data, Stream saveStream) 
{ 
    var codex = data.Decoder.CodecInfo; 
    var encoder = BitmapEncoder.Create(codex.ContainerFormat); 
    encoder.Frames.Add(data); 
    encoder.Save(saveStream); 
} 

когда я бегу он бросает

System.NotSupportedException произошло HResult = -2146233067

Сообщение = Указанный метод не поддерживается. Источник = PresentationCore

StackTrace: в System.Windows.Media.Imaging.BitmapEncoder.Save (поток Поток) в FileFormatters.Export.SaveImage (данные BitmapFrame, поток saveStream)

InnerException: нуль

страница MSDN говорит

NotSupportedException: значение Frames, которое передается в кодировщик равна нулю.

NotSupportedException: количество кадров меньше или равно нулю.

Однако кадры подсчета равно 1 и данные не является нулевым

дополнительно Информация о

arc declared as using (ZipArchive arc = new ZipArchive(stream, ZipArchiveMode.Create)) 
image.Data is byte[] 
codex.FriendlyName = "PNG Decoder" 
encoder.CodecInfo.FriendlyName = "PNG Encoder" 
+0

Попытка немедленно загрузить растровое изображение с помощью MemoryStream 'вар ВМР = BitmapFrame.Create (MEM, BitmapCreat eOptions.None, BitmapCacheOption.OnLoad); 'Кроме того, не могли бы вы просто написать оригинал' image.Data' в архив? – Clemens

+0

@ Clemens благодарит за вашу помощь, к сожалению, это было первое, что, как я думал, не имело никакого эффекта, так как для пропуска декодирования я боюсь, что в качестве следующей операции нужно нарисовать коллекцию штрихов сверху кадра и сохранить это как второе изображение – MikeT

ответ

1

Это, как представляется, необходимо записать буфер изображения в промежуточную MemoryStream, прежде чем он может быть записан ZipEntry поток:

private static void SaveImage(BitmapFrame data, Stream saveStream) 
{ 
    var encoder = BitmapEncoder.Create(data.Decoder.CodecInfo.ContainerFormat); 
    encoder.Frames.Add(data); 

    using (var memoryStream = new MemoryStream()) 
    { 
     encoder.Save(memoryStream); 
     memoryStream.Position = 0; 
     memoryStream.CopyTo(saveStream); 
    } 
} 
+1

Итак, растровые кодировщики не поддерживают сжатые потоки? это будет полезной информацией для включения в страницу MSDN – MikeT