2008-12-21 151 views
18

我创建了一个WPF应用程序,所以我主要使用图标的ImageSource类。但是,系统托盘图标必须为System.Drawing.Icon。是否可以从PNG图像创建这样的对象?如何从PNG图像获取图标?

我曾尝试以下:

private static System.Drawing.Icon _pngIcon; 
public static System.Drawing.Icon PngIcon 
{ 
    get 
    { 
     if (_pngIcon == null) 
     { 
      //16x16 png image (24 bit or 32bit color) 
      System.Drawing.Bitmap icon = global::BookyPresentation.Properties.Resources.star16; 
      MemoryStream iconStream = new MemoryStream(); 
      icon.Save(iconStream, System.Drawing.Imaging.ImageFormat.Png); 
      iconStream.Seek(0, SeekOrigin.Begin); 
      _pngIcon = new System.Drawing.Icon(iconStream); //Throws exception 
     } 
     return _pngIcon; 
    } 
} 

图标构造函数抛出具有以下消息的异常:“论证‘图像’必须是可以被用作图标的图片。”

我想它可能是图像颜色的位深度的东西,因为我之前有过一些问题,但32位和24位图像都不起作用。我想要做什么?

回答

17

我想你可以尝试这样的事情之前转换您的图像.ICO:

var bitmap = new Bitmap("Untitled.png"); // or get it from resource 
    var iconHandle = bitmap.GetHicon(); 
    var icon = System.Drawing.Icon.FromHandle(iconHandle); 

icon将包含你所需要的图标。

+4

当我使用这种方法时,我只能得到16个颜色图标 – 2009-11-04 13:06:08

0

您可以尝试一个名为png2ico的小命令行应用程序。我用它从png创建Windows图标。

+0

我试过了,但它完全毁在透明区域的边缘的图像。 – 2008-12-21 21:59:10

3

图标是3种或4的图像尺寸的组合:

48×48,32×32,24×24(可选),和16×16像素。

并能/还应包含三种不同颜色深度:

  • 24位与8位α(32位)
  • 8位(256色)与1位透明度
  • 4位(16色)与1位透明度

所以.PNG存储器流不会配合到图标的构造。实际上,如果您阅读其他constructor overloads上的注释,则会看到所有“尺寸”或“宽度”和“高度”度量,以查找文件中正确尺寸的图标。在手动创建的图标

更多的信息可以“Creating Windows XP Icons

3

下发现有一个叫IconLib一个.NET项目。

public void Convert(string pngPath, string icoPath) 
{ 
    MultiIcon mIcon = new MultiIcon(); 
    SingleIcon sIcon = mIcon.Add("Icon1"); 
    sIcon.CreateFrom(pngPath, IconOutputFormat.FromWin95); 
    mIcon.SelectedIndex = 0; 
    mIcon.Save(icoPath, MultiIconFormat.ICO); 
} 
+0

谢谢,我需要这个程序;) – frameworkninja 2009-08-06 12:34:29

1

你可以设置一个窗口图标的ImageSource到PNG图像,它的工作,令人惊讶。虽然我没有验证过托盘图标。

+2

这对托盘图标不起作用。 – 2011-09-27 09:36:35

1

试试这个它的工作对我来说,

window.Icon = BitmapFrame.Create(Application.GetResourceStream(new Uri("YourImage.png", 
UriKind.RelativeOrAbsolute)).Stream);