2008-12-21 17 views
18

Estoy creando una aplicación WPF, así que estoy trabajando principalmente con la clase ImageSource para iconos. Sin embargo, el icono de la bandeja del sistema debe ser del tipo System.Drawing.Icon. ¿Es posible crear dicho objeto desde una imagen png?¿Cómo obtengo un ícono de una imagen png?

he intentado lo siguiente:

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

El constructor del icono lanza una excepción con el siguiente mensaje: " 'imagen' argumento debe ser una imagen que se puede utilizar como un icono".

Pensé que podría ser algo con la profundidad de bits del color de la imagen ya que tuve algunos problemas con esto antes, pero las imágenes de 32 bits y de 24 bits no funcionaron. ¿Es posible lo que intento hacer?

Respuesta

17

Creo que se puede intentar algo como esto antes de convertir la imagen a .ico:

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

Dónde icon contendrá el icono de la que necesita.

+4

Solo obtengo 16 iconos de color cuando uso este método –

0

Puede probar una pequeña aplicación de línea de comandos llamada png2ico. Lo uso para crear iconos de Windows desde pngs.

+0

lo he intentado, pero arruinado por completo la imagen en los bordes de las áreas transparentes. –

3

iconos son una combinación de 3 o 4 tamaños de imagen:

48 × 48, 32 × 32, 24 × 24 (opcional), y 16 x 16 píxeles.

y CAN/también debe contener tres diferentes profundidades de color:

  • 24-bits con 8 bits alfa (32-bit)
  • 8 bits (256 colores) con la transparencia de 1 bit
  • de 4 bits (16 colores) con la transparencia de 1 bit

Así que la secuencia de memoria .png no va a encajar en el constructor del icono. De hecho, si lee las notas en el otro constructor overloads, verá todas las medidas de "Tamaño" o Ancho y Altura para encontrar el icono de tamaño correcto en el archivo.

Más información sobre la creación manual de iconos se puede encontrar en "Creating Windows XP Icons"

3

Hay un proyecto llamado .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

gracias, necesito este programa;) – frameworkninja

1

Puede establecer el ImageSource de un icono de ventana en una imagen png y funciona, sorprendentemente. Sin embargo, no he verificado esto para los iconos de la bandeja.

+2

Esto no funciona para los íconos de la bandeja. –

1

probar este su trabajo para mí,

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