2008-12-21 149 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);