从c#中的图标文件创建System.Windows.Media.ImageSource?

时间:2014-05-22 21:56:50

标签: c# wpf

我正在使用c#编写WPF应用程序。我有时需要更改通知器图标;

我实现了这样的图标:

<tn:NotifyIcon x:Name="MyNotifyIcon" 
               Text="Title" 
               Icon="Resources/logo/Error.ico"/>

我的解决方案是更改Icon, MyNotifyIcon.Icon 的类型是ImageSource,我希望通过图标文件获取。我能找到办法做到这一点。

有人有一些想法如何?或者有其他解决方案吗?

很快,我有一个像 /Resource/logo.icon 这样的地址,我想要一个 System.Windows.Media.ImageSource

3 个答案:

答案 0 :(得分:2)

您可以使用BitmapImage类:

        // Create the source
        BitmapImage img = new BitmapImage();
        img.BeginInit();
        img.UriSource = new Uri("./Resource/logo/logo.icon");
        img.EndInit();


BitmapImage类继承自ImageSource类,这意味着您可以将BitmapImage对象传递给NotifyIcon.Icon,如下所示:


NI.Icon = img;

答案 1 :(得分:1)

您是否正在使用Philipp Sumi创建的Hardcodet.Wpf.TaskbarNotification命名空间中的NotifyIcon?如果是这样,您可以选择将图标指定为ImageSource或图标。

TaskbarIcon notifyIcon = new TaskbarIcon();
// set using Icon
notifyIcon.Icon = some System.Drawing.Icon; 
// set using ImageSource
notifyIcon.IconSource = some System.Windows.Media.ImageSource; 

请注意,内部设置IconSource会设置Icon。

从资源设置。

notifyIcon.Icon = MyNamespace.Properties.Resources.SomeIcon

答案 2 :(得分:0)

您是否考虑过使用资源?

从资源中获取:

MainNameSpace.Properties.Resources.NameOfIconFileInResources;

将图标放在资源中,如果你有图像文件(不是图标)我有一个方法可以改变它:

    public static Icon toIcon(Bitmap b)
    {
        Bitmap cb = (Bitmap) b.Clone();
        cb.MakeTransparent(Color.White);
        System.IntPtr p = cb.GetHicon();
        Icon ico = Icon.FromHandle(p);
        return ico;
    }

以编程方式使用已知属性更改它.Icon; 不要担心ImageSource类型。

从图标(.ico)文件中提取图像:

Stream iconStream = new FileStream (MainNameSpace.Properties.Resources.NameOfIconFileINResources, FileMode.Open );
IconBitmapDecoder decoder = new IconBitmapDecoder ( 
    iconStream, 
    BitmapCreateOptions.PreservePixelFormat, 
    BitmapCacheOption.None );

// loop through images inside the file
foreach ( var item in decoder.Frames )
{
 //Do whatever you want to do with the single images inside the file
 this.panel.Children.Add ( new Image () { Source = item } );
}

// or just get exactly the 4th image:
var frame = decoder.Frames[3];

// save file as PNG
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(frame);
using ( Stream saveStream = new FileStream ( @"C:\target.png", FileMode.Create ))
{
    encoder.Save( saveStream );
}

但是你必须把.ico文件放在资源中,或者用相对路径把它...

取自How can you access icons from a Multi-Icon (.ico) file using index in C#