2011-02-04 19 views
5

Estoy tratando de convertir una imagen PNG transparente como un ImageSource en un System.Drawing.Icon que respeta la transparencia del archivo PNG.Convertir PNG transparente a System.Drawing.Icon en el código

WPF de alguna manera puede hacer esto internamente si configura el icono para una ventana a un PNG ImageSource, pero ¿hay alguna forma en que pueda hacerlo manualmente? Específicamente, necesito esto para configurar el icono de notificación de la bandeja del sistema y realmente quiero evitar el uso de recursos de formato .ico torpes.

+0

Como nota al margen, Windows Vista + admite archivos .ico que en realidad están en formato PNG. ¿Esto funciona para tí? http://blogs.msdn.com/b/oldnewthing/archive/2010/10/22/10079192.aspx – MerickOWA

+0

No, a menos que haya alguna utilidad/función en .NET que pueda usar para construir un .ico desde un PNG en el volar ... Es bueno saberlo, aunque. – devios1

+0

@chaiguy ¿ha mirado usando http://www.hardcodet.net/projects/wpf-notifyicon para hacer cosas en la bandeja del sistema WPF? – MerickOWA

Respuesta

6

Puede escribir

Icon.FromHandle(image.GetHIcon()) 

You'll need to explicitly destroy the icon when you're done with it:

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
extern static bool DestroyIcon(IntPtr handle); 

DestroyIcon(newIcon.Handle); 
+0

Completamente fuera del tema aquí, pero felicidades por la elección del moderador, @SLaks! –

+0

El problema aquí es que GetHIcon() es un método de mapa de bits, no de ImageSource, y no parece haber una forma sensata de obtener un mapa de bits de un ImageSource, el único método que encontré (que tenía unas 20 líneas de longitud)) no conserva la transparencia PNG. – devios1

1

Estoy buscando este ~ Aquí está uno, pero no es muy bueno!

 Icon icon; 
     Image source = Image.FromFile(picturefile, true); 

     Bitmap target = new Bitmap(iconsize, iconsize, 
      System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

     Graphics g = Graphics.FromImage(target); 
     g.DrawImage(source, 0, 0, iconsize, iconsize); 

     //target.Save("c:\\temp\\forest.bmp"); 

     icon = Icon.FromHandle(target.GetHicon()); 

     FileStream fs = File.Create(iconfile); 
     icon.Save(fs); 
     fs.Close(); 

     icon.Dispose(); 
     target.Dispose(); 
     source.Dispose();