如何将Window的图标转换为BitmapImage

时间:2014-07-21 21:50:09

标签: c# .net wpf bitmapimage imagesource

我试图通过此帖子Convert ImageSource to BitmapImage - WPF的帮助将我的iconImageSource BitmapImage转换为var bi = _window.Icon as BitmapImage;

_window.Icon

问题是演员没有发生(执行此行后bi为null)并且我确定ImageSource不为空,任何人都可以告诉我为什么没有发生这种转换?

更新:

虽然Visual Studio文档说Window.Icon是tyme System.Windows.Media.Imaging.BitmapFrameDecode但是调试器说它是var bi = (BitmapImage) _window.Icon;

做的时候:

{{1}}

我得到以下异常:

  

附加信息:无法投射类型的对象   ' System.Windows.Media.Imaging.BitmapFrameDecode'输入   ' System.Windows.Media.Imaging.BitmapImage'

2 个答案:

答案 0 :(得分:1)

  

问题在于没有发生强制转换(执行此行后bi为null)并且我确定_window.Icon不为null

它不是空的,但它可能不是BitmapImageWindow.Icon的类型为ImageSourceBitmapImage来自System.Windows.Media.Imaging.BitmapFrameDecode。在XAML中设置图标时,图像的类型通常为BitmapFrame,这是从BitmapImage派生的内部类;所以它不是System.Drawing.Bitmap,这就是演员失败的原因。


编辑:如果您只需将图标转换为BitmapImage,则不需要BitmapSource; var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create((BitmapSource)_window.Icon)); using (var stream = new MemoryStream())) { encoder.Save(stream); stream.Position = 0; // rewind the stream var bitmap = (System.Drawing.Bitmap)System.Drawing.Image.FromStream(stream); var icon = System.Drawing.Icon.FromHandle(bitmap.GetHicon()); } 就足够了。

{{1}}

答案 1 :(得分:1)

不知道为什么你需要投射到BitmapImage。在每种实际情况下,转换为BitmapSource(这是BitmapImageBitmapFrame的共同基类)应该足够了:

var bitmap = _window.Icon as BitmapSource;

BitmapSource提供所有相关的位图属性,例如PixelWidthPixelHeigthDpiXDpiYFormat等。