2015-12-18 2 views
4

У меня есть кнопка и изображение с именем image1 в моем приложении wpf. Я хочу добавить источник изображения изображения1 из значка файла местоположения или пути к файлу. Вот мой код:Как преобразовать значок (растровое изображение) в ImageSource?

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'

Как решить эту проблему?

+0

Это может помочь: http://stackoverflow.com/a/26261562/424129 –

ответ

5

Решение, предложенное Фархан Анам будет работать, но он не идеален: иконка загружается из файла, преобразуется в растровое изображение, сохраненное в потоке и перезагруженное из потока. Это довольно неэффективно.

Другой подход заключается в использовании 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 блок утилизации оригинальный значок после преобразовал его. Это не приведет к утечкам ручек.

+0

Да, я так и думал ... +1 :) –

4

Ошибка возникает потому, что вы пытаетесь назначить растровое изображение как источник изображения. Чтобы исправить это, используйте эту функцию:

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()); 
+0

Спасибо Farhab Anam. Ваш код дал мне решение. Большое спасибо. :) –

+0

привет снова. У меня есть изображение с черным фоном в элементе управления image1. Можно ли изменить цвет фона с черного на белый? Благодарю. –

+0

Этот подход работает, но неэффективен –

Смежные вопросы