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 が発生しました HResult=-2146233067

Message=指定されたメソッドはサポートされていません。ソース=PresentationCore

StackTrace: System.Windows.Media.Imaging.BitmapEncoder.Save(ストリーム ストリーム) で FileFormatters.Export.SaveImage(BitmapFrame データ、ストリーム saveStream) で

内部例外: null

MSDNページには

NotSupportedException : エンコーダーに渡される Frames 値が null です。

NotSupportedException : フレーム数がゼロ以下です。

ただし、フレーム数は 1 であり、データは null ではありません

詳細情報

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

1 に答える 1

4

ZipEntry Stream に書き込む前に、画像バッファーを中間の 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);
    }
}
于 2016-08-16T10:56:59.900 に答える