2

XMLファイルとの間でImageSource(または)を保存およびロードしようとしています。BitmapSourceSOをざっと見てみると、この答えが得られました。

見た目は大丈夫だったので試してみましたが、奇妙な結果になりました。

このコードを試してみると、すべてが機能します。

BitmapSource testImgSrc = new WriteableBitmap(new BitmapImage(new Uri("pack://application:,,,/MyNameSpace;component/Images/MyImg.png")));
BackgroundImage = testImgSrc;

しかし、このコードを試してみると、画像がまったく表示されません。

BitmapSource testImgSrc = new WriteableBitmap(new BitmapImage(new Uri("pack://application:,,,/MyNameSpace;component/Images/MyImg.png")));
string testImgStr = ImageToBase64(testImgSrc);
BitmapSource testImg = Base64ToImage(testImgStr);
BackgroundImage = testImg;

エラーや例外はないようです。コードをステップスルーするBackgroundImageと、有効な画像オブジェクトに設定されているように見えます。

私のWPFフォームには、プロパティの結果を返すプロパティにバインドされたソースを持つ画像コントロールがありBackgroundImageます。最初のテストは期待どおりに機能するため、バインディングは正常に機能していると思います。

2番目のテストで画像が表示されない理由を誰かが理解するのを手伝ってもらえますか?

4

1 に答える 1

5

この回答Base64ToImageの方法に問題があります。ドキュメントには、デフォルトのキャッシュオプションでは、イメージが実際に使用される前にストリームを閉じてはならないことが記載されています。あなたの場合、これは要素がすでに破棄されたストリームにアクセスしようとしていることを意味します。OnDemandImage

修正は非常に簡単です。キャッシュオプションをに変更するだけOnLoadで、問題は解決します。

BitmapSource Base64ToImage(string base64)
{
    byte[] bytes = Convert.FromBase64String(base64);
    using (var stream = new MemoryStream(bytes))
    {
        return BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    }
}
于 2012-11-16T20:56:26.253 に答える