首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF BitmapSource ImageSource

WPF BitmapSource ImageSource
EN

Stack Overflow用户
提问于 2009-01-14 19:28:47
回答 3查看 17K关注 0票数 7

我将一个Image.Source属性绑定到如下所示的属性的结果。

代码语言:javascript
复制
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程序集中的深层)。我确信图像没有损坏,因为我可以成功地显示与绑定相同的图像

代码语言:javascript
复制
<Image Name="FooImage" Source="/logo.png" />

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

谁知道这是不是WPF的bug?或者我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-15 05:54:04

问题出在更改为BitmapCacheOption.OnLoad works的BitmapCacheOption选项上。

使用BitmapCacheOption.None,直到图像呈现时,BitmapSource才会被解码,但是包含png的流已经在那个点上被处理了。如果缓存OnLoad,它会立即解码并缓存结果,而不是等到流不再存在时再尝试解码。

票数 11
EN

Stack Overflow用户

发布于 2009-01-14 20:11:35

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

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

代码语言:javascript
复制
BitmapImage img = new BitmapImage(new Uri(@"C:\Temp\logo.png"));
return img;
票数 2
EN

Stack Overflow用户

发布于 2009-01-14 20:03:30

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

如果我在你的代码中使用了一个已知的PNG,我不会理解你的问题,但是会抛出一个COM异常:

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

你能在网上用一个随机的PNG尝试一下,看看你是否得到了同样的结果吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/444331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档