如何将图标(位图)转换为ImageSource
本文关键字:转换 ImageSource 位图 图标 | 更新日期: 2023-09-27 18:27:18
我的wpf应用程序中有一个按钮和一个名为image1的图像。我想从一个位置或文件路径的文件图标添加image1的图像源。这是我的代码:
using System.Windows;
using System.Windows.Media.Imaging;
using System.IO;
using System.Drawing;
namespace WpfApplication2
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Icon ico = System.Drawing.Icon.ExtractAssociatedIcon(@"C:'WINDOWS'system32'notepad.exe");
image1.Source = ico.ToBitmap();
}
}
}
错误是说
无法将类型"System.Drawing.Bitmap"隐式转换为"System.Windows.Media.ImageSource"
如何解决这个问题?
Farhan Anam建议的解决方案会起作用,但并不理想:图标从文件中加载,转换为位图,保存到流中,然后从流中重新加载。这是相当低效的。
另一种方法是使用System.Windows.Interop.Imaging
类及其CreateBitmapSourceFromHIcon
方法:
private ImageSource IconToImageSource(System.Drawing.Icon icon)
{
return Imaging.CreateBitmapSourceFromHIcon(
icon.Handle,
new Int32Rect(0, 0, icon.Width, icon.Height),
BitmapSizeOptions.FromEmptyOptions());
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
using (var ico = System.Drawing.Icon.ExtractAssociatedIcon(@"C:'WINDOWS'system32'notepad.exe"))
{
image1.Source = IconToImageSource(ico);
}
}
请注意using
块在转换原始图标后将其丢弃。不这样做会导致句柄泄漏。
您得到的错误是因为您试图将位图指定为图像的源。要纠正这种情况,请使用以下功能:
BitmapImage BitmapToImageSource(Bitmap bitmap)
{
using (MemoryStream memory = new MemoryStream())
{
bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
memory.Position = 0;
BitmapImage bitmapimage = new BitmapImage();
bitmapimage.BeginInit();
bitmapimage.StreamSource = memory;
bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
bitmapimage.EndInit();
return bitmapimage;
}
}
像这样:
image1.Source = BitmapToImageSource(ico.ToBitmap());