我试图通过此帖子Convert ImageSource to BitmapImage - WPF的帮助将我的icon
类ImageSource
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'
答案 0 :(得分:1)
问题在于没有发生强制转换(执行此行后bi为null)并且我确定_window.Icon不为null
它不是空的,但它可能不是BitmapImage
。 Window.Icon
的类型为ImageSource
,BitmapImage
来自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
(这是BitmapImage
和BitmapFrame
的共同基类)应该足够了:
var bitmap = _window.Icon as BitmapSource;
BitmapSource
提供所有相关的位图属性,例如PixelWidth
,PixelHeigth
,DpiX
,DpiY
,Format
等。