2008-12-21 10 views
18

Je crée une application WPF, donc je travaille principalement avec la classe ImageSource pour les icônes. Cependant, l'icône de la barre d'état système doit être de type System.Drawing.Icon. Est-il possible de créer un tel objet à partir d'une image png?Comment obtenir une icône à partir d'une image png?

J'ai essayé ce qui suit:

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; 
    } 
} 

Le constructeur d'icône lance une exception avec le message suivant: « Argument « image » doit être une image qui peut être utilisé comme une icône. »

Je pensais que ce serait peut-être quelque chose avec la profondeur de bit de la couleur de l'image que j'ai eu quelques problèmes avec cela plus tôt, mais les deux images 32bit et 24bit ne fonctionne pas. Est-ce possible ce que j'essaie de faire?

Répondre

17

Je pense que vous pouvez essayer quelque chose comme ça avant de convertir votre image à Ico:

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

icon contiendra l'icône dont vous avez besoin.

+4

Je reçois seulement 16 icônes de couleur quand j'utilise cette méthode –

0

Vous pouvez essayer une petite application de ligne de commande appelée png2ico. Je l'utilise pour créer des icônes Windows à partir de pngs.

+0

J'ai essayé, mais totalement ruinés l'image sur les bords des zones transparentes. –

3

icônes sont une combinaison de 3 ou 4 tailles d'image:

48 x 48, 32 x 32, 24 x 24 (facultatif), et 16 × 16 pixels.

Et peut/devrait également contenir des trois profondeurs de couleurs différentes:

  • 24-bit avec 8-bit alpha (32 bits)
  • 8 bits (256 couleurs) avec transparence à 1 bit
  • 4 bits (16 couleurs) avec transparence 1 bit

Ainsi, le flux de mémoire .png ne va pas entrer dans le constructeur de l'icône. En fait, si vous lisez les notes sur l'autre constructor overloads, vous verrez toutes les mesures "Taille" ou Largeur et Hauteur pour trouver l'icône de taille correcte dans le fichier.

Plus d'informations sur la création manuelle d'icônes se trouve sous « Creating Windows XP Icons »

3

Il y a un projet .NET IconLib.

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

merci, j'ai besoin de ce programme;) – frameworkninja

1

Vous pouvez définir l'icône ImageSource d'une fenêtre sur une image png et cela fonctionne, de manière surprenante. Je n'ai pas vérifié ceci pour des icônes de plateau cependant.

+2

Cela ne fonctionne pas pour les icônes de plateau. –

1

Essayez ce son travail pour moi,

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