2008-12-21 10 views
18

Ich erstelle eine WPF-App, daher arbeite ich hauptsächlich mit der ImageSource-Klasse für Symbole. Das Taskleistensymbol muss jedoch vom Typ System.Drawing.Icon sein. Ist es möglich, ein solches Objekt aus einem PNG-Bild zu erstellen?Wie bekomme ich ein Icon von einem PNG-Bild?

Ich habe versucht, die folgende:

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

Der Icon-Konstruktor eine Ausnahme mit der folgenden Meldung wirft: „Argument‚Bild‘muß ein Bild sein, das als Symbol verwendet werden kann“

Ich dachte, es könnte etwas mit der Bittiefe der Bildfarbe sein, da ich einige Probleme mit dieser früheren hatte, aber 32-Bit- und 24-Bit-Bilder haben nicht funktioniert. Ist es möglich, was ich versuche?

Antwort

17

Ich glaube, Sie so etwas wie dies vor konvertieren Ihr Bild kann versuchen .ico:

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

Wo icon das Symbol enthält, die Sie benötigen.

+4

Ich bekomme nur 16 Farbsymbole, wenn ich diese Methode verwende –

0

Sie könnten versuchen, eine kleine Befehlszeilen-App namens png2ico. Ich benutze es um Windows-Icons von PNGs zu erstellen.

+0

ich versucht, aber es ruiniert vollständig das Bild an den Rändern der transparenten Bereiche. –

3

Icons sind eine Kombination von 3 oder 4 Bildgrößen:

48 × 48, 32 × 32, 24 × 24 (optional), und 16 × 16 Pixel.

Und kann/sollte auch drei verschiedene Farbtiefen enthalten:

  • 24-Bit mit 8-Bit Alpha (32-Bit)
  • 8-Bit (256 Farben) mit 1-Bit-Transparenz
  • 4-Bit (16 Farben) mit 1-Bit-Transparenz

So ist der .png Speicherstrom geht nicht in das Konstrukteurs-Symbol passen. In der Tat, wenn Sie die Notizen auf der anderen constructor overloads lesen, sehen Sie alle "Größe" oder Breite und Höhe Messungen zum Finden der richtigen Größe Symbol in der Datei.

Mehr Informationen über die manuelle Erstellung von Icons können unter „Creating Windows XP Icons

3

findet Es gibt ein .NET-Projekt IconLib genannt wird.

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

danke, ich brauche dieses Programm;) – frameworkninja

1

Sie können die ImageSource eines Fenstersymbols auf ein PNG-Bild und es funktioniert, überraschend. Ich habe dies jedoch nicht für Tray-Icons verifiziert.

+2

Dies funktioniert nicht für Tray-Icons. –

1

Versuchen Sie, für mich diese ihre Arbeits,

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