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

您确定它是 PNG 而不仅仅是重命名的位图或 Jpeg 吗?如果您创建一个新的位图图像,然后只是重命名它并更改文件扩展名,则此错误是可重现的。

如果我在您的代码中使用已知的 PNG,我不会遇到您的问题,但会引发 COM 异常:

句柄无效。(来自 HRESULT 的异常:0x80070006 (E_HANDLE))

你能用网络上的随机 PNG 试试看是否得到相同的结果吗?

于 2009-01-14T20:03:30.467 回答