2009-01-14 77 views
7

我将Image.Source属性绑定到下面显示的属性的结果。WPF BitmapSource图像源

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; 
    } 
} 

由于某些原因,在呈现图像期间(DeepCopy PresentationCore程序集),这是失败的。我敢肯定的形象是不是贪官,我可以成功显示同一图像W/O绑定

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

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

任何人都知道这是一个错误w/WPF?还是我做错了什么?

回答

11

问题是BitmapCacheOption选项,切换到BitmapCacheOption.OnLoad工作。

使用BitmapCacheOption.None时,BitmapSource不会解码,直到呈现图像为止,但其中包含png的流已经放置在该点。如果您缓存OnLoad,它将立即解码并缓存结果,而不是稍后在流不再存在时尝试解码。

+1

噢谢天谢地,我一直在努力解决这个问题。谢谢! – gerrod 2010-03-15 12:55:31

0

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

如果我用你的代码已知PNG,我不明白你的问题,而是一个COM异常被抛出:

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

你可以用一个随机PNG离开网页试试看,看看你是否得到相同的结果?

+0

没错,这是我得到相同的异常,从> \t PresentationCore.dll中来了!MS.Internal.HRESULT.Check(INT小时)线1013 + 0xd中的字节\t C# 我得到它瓦特/我的图片以及来自网络的随机png。 – user38309 2009-01-14 20:31:26

2

此外,你有没有尝试过只是使用BitmapImage加载图像?它适用于PNG,BMP和JPEG。

这也是一种特殊类型的BitmapSource的,所以你可以只用这个替换您的属性代码:

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

您的建议可行,但我需要最终从base64字符串创建此映像,所以我不会有一个URI来简单地创建一个BitmapImage。 – user38309 2009-01-14 20:22:13