WPF BitmapSource ImageSource

时间:2009-01-14 19:28:47

标签: c# wpf xaml binding

我将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程序集中为Deep)失败。我确信图像没有损坏,因为我可以成功显示没有绑定的相同图像

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

我必须在代码中绑定图像源,因为我最终将从base64字符串创建图像流。

任何人都知道这是否是WPF的错误?或者我做错了什么?

3 个答案:

答案 0 :(得分:11)

问题是BitmapCacheOption选项,更改为BitmapCacheOption.OnLoad工作。

使用BitmapCacheOption.None,BitmapSource在渲染图像之前不会被解码,但是其中包含png的流已经被放置在该点。如果你缓存OnLoad,它会立即解码并缓存结果,而不是在流不再存在时尝试解码。

答案 1 :(得分:2)

另外,您是否尝试使用BitmapImage加载图像?它适用于PNG,BMP和JPEG。

它也是一种特殊类型的BitmapSource,因此您只需用以下内容替换属性中的代码:

BitmapImage img = new BitmapImage(new Uri(@"C:\Temp\logo.png"));
return img;

答案 2 :(得分:0)

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

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

  

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

你可以在网上随机使用PNG进行尝试,看看你是否得到了相同的结果吗?