7

以下に示すプロパティの結果に Image.Source プロパティをバインドしています。

public BitmapSource MyImageSource
{
    get
    {
        BitmapSource source = null;

        PngBitmapDecoder decoder;
        using (var stream = new FileStream(@"C:\Temp\logo.png", FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            decoder = new PngBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);

            if (decoder.Frames != null && decoder.Frames.Count > 0)
                source = decoder.Frames[0];
        }

        return source;
    }
}

何らかの理由で、画像のレンダリング中にこれが失敗します (PresentationCore アセンブリの奥深く)。バインディングなしで同じ画像を正常に表示できるため、画像が破損していないことは確かです

<Image Name="FooImage" Source="/logo.png" />

最終的に base64 文字列からイメージ ストリームを作成するため、コードでイメージ ソースをバインドする必要があります。

これがWPFのバグかどうかは誰にも分かりますか? または私は何か間違ったことをしていますか?

4

3 に答える 3

11

問題は、BitmapCacheOptionオプションであり、BitmapCacheOption.OnLoadに変更すると機能します。

BitmapCacheOption.Noneを使用すると、画像がレンダリングされるまでBitmapSourceはデコードされませんが、pngを含むストリームはその時点ですでに破棄されています。OnLoadをキャッシュすると、ストリームが存在しなくなったときに後でデコードしようとするのではなく、すぐにデコードして結果をキャッシュします。

于 2009-01-15T05:54:03.567 に答える
2

また、BitmapImage を使用してイメージをロードしようとしましたか? PNG、BMP、および JPEG で問題なく動作します。

これは BitmapSource の特殊なタイプでもあるため、プロパティのコードを次のように置き換えるだけです。

BitmapImage img = new BitmapImage(new Uri(@"C:\Temp\logo.png"));
return img;
于 2009-01-14T20:11:35.100 に答える
0

名前が変更されたビットマップや Jpeg ではなく、PNG であると確信していますか? 新しいビットマップ イメージを作成し、名前を変更してファイル拡張子を変更すると、このエラーが再現されます。

コードで既知の PNG を使用すると、問題は発生しませんが、COM 例外がスローされます。

ハンドルが無効です。(HRESULT からの例外: 0x80070006 (E_HANDLE))

ウェブ上のランダムな PNG で試してみて、同じ結果が得られるかどうかを確認できますか?

于 2009-01-14T20:03:30.467 に答える