WPF中的BitmapSource和ImageSource

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的错误吗?还是我做错了什么?

3个回答

11
问题出在BitmapCacheOption选项上,将其改为BitmapCacheOption.OnLoad即可解决。如果使用BitmapCacheOption.None,直到渲染图像时BitmapSource才被解码,但此时png文件所在的流已经被释放了。如果缓存OnLoad,它将立即解码并缓存结果,而不是在流不存在时尝试以后再解码。

1
哦,谢天谢地,我已经在过去的一个小时里一直在努力解决这个问题。谢谢! - gerrod
在加载图像并返回之前,还要使用source.Freeze()。 - Matthias

2

另外,你是否尝试过使用BitmapImage来加载图像?它可以很好地处理PNG、BMP和JPEG格式的图片。

它也是BitmapSource的一种特殊类型,因此你可以用以下代码替换原有属性中的代码:

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

你的建议是可行的,但我最终需要从一个base64字符串创建这个图像,所以我没有一个URI可以简单地创建一个BitmapImage。 - user38309

0

你确定它是PNG格式而不是重命名的位图或JPEG格式吗?如果你创建了一个新的位图图像,然后只是重命名并更改文件扩展名,那么这个错误就可以再现。

如果我使用已知的PNG格式图片与你的代码一起使用,我不会遇到你的问题,但会抛出COM异常:

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

你能否尝试使用从网上随机下载的PNG格式图片,看看是否会得到相同的结果?


没错,这就是我得到的同样的异常,来自于 > PresentationCore.dll!MS.Internal.HRESULT.Check(int hr) Line 1013 + 0xd bytes C#我在我的图像上以及从网上随机下载的 png 上都遇到了这个问题。 - user38309

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接