如何将图标(位图)转换为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"

如何解决这个问题?

如何将图标(位图)转换为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());