位图编码器保存不支持。

4
我有以下代码,但我看不出有什么问题,请问可能是什么问题?
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 occurred HResult=-2146233067

Message=指定的方法不受支持。 Source=PresentationCore

StackTrace: at System.Windows.Media.Imaging.BitmapEncoder.Save(Stream stream) at FileFormatters.Export.SaveImage(BitmapFrame data, Stream saveStream)

InnerException: null

MSDN页面显示:

NotSupportedException:传递给编码器的框架值为null。

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"

尝试通过var bmp = BitmapFrame.Create(mem, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);立即从MemoryStream加载位图。此外,您是否可以将原始的image.Data写入存档中? - Clemens
@Clemens 感谢您的帮助,不幸的是,这是我想到的第一件事情,但没有任何效果。至于跳过解码,恐怕不行,因为下一个操作是在帧上绘制笔画集合,并将其保存为第二个图像。 - MikeT
1个回答

4

在写入到ZipEntry流之前,似乎需要将图像缓冲区写入到一个中间MemoryStream中:

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

2
位图编码器不支持压缩流吗?在MSDN页面中包含这些信息会很有用。 - MikeT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接