2

ストリームについてはよくわかりません。最初のバージョンではファイルを使用して動作するのに、2 番目のバージョンでは動作しないのはなぜですか? 「return dest;」にブレークポイントを設定する どちらもまったく同じものを作成しているように見えますが、dest は常に 2 番目のバージョンを使用した空白のイメージです。

    public static BitmapSource ConvertByteArrayToBitmapSource(Byte[] imageBytes, ImageFormat formatOfImage)
{
    BitmapSource dest = null;
    if (formatOfImage == ImageFormat.Png)
    {
        var streamOut = new FileStream("tmp.png", FileMode.Create);
        streamOut.Write(imageBytes, 0, imageBytes.Length);
        streamOut.Close();

        Uri myUri = new Uri("tmp.png", UriKind.RelativeOrAbsolute);
        var bdecoder2 = new PngBitmapDecoder(myUri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        dest = bdecoder2.Frames[0];
    }

    return dest;
}

public static BitmapSource ConvertByteArrayToBitmapSource_NoWork(Byte[] imageBytes, ImageFormat formatOfImage)
{
    BitmapSource dest = null;
    using (var stream = new MemoryStream(imageBytes))
    {
        var bdecoder = new PngBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        stream.Flush();
        dest = bdecoder.Frames[0];
        stream.Close();
    }

    return dest;
}
4

1 に答える 1

8

BitmapCacheOption.OnLoadそうしないと、ビットマップが初めて表示されるときにロードされるため、指定する必要があります。ただし、ストリームはすでに破棄されています。

また、さまざまな画像形式をサポートし、パフォーマンスを向上させるために画像をフリーズするこのバージョンを見てください。

public static BitmapSource ConvertByteArrayToBitmapSource(Byte[] imageBytes)
{
    using (MemoryStream stream = new MemoryStream(imageBytes))
    {
        BitmapDecoder deconder = BitmapDecoder.Create(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
        BitmapFrame frame = deconder.Frames.First();

        frame.Freeze();
        return frame;
    }
}
于 2011-06-22T07:15:35.413 に答える