2011-02-04 19 views
5

Sto cercando di convertire un'immagine PNG trasparente come ImageSource in un System.Drawing.Icon che rispetta la trasparenza del PNG.Converti PNG trasparente in System.Drawing.Icon nel codice

WPF può in qualche modo eseguire questa operazione internamente se si imposta l'icona di una finestra su PNG ImageSource, ma esiste un modo per farlo manualmente? In particolare ho bisogno di questo per impostare l'icona di notifica del vassoio di sistema e voglio davvero evitare l'uso di risorse in formato .ico maldestro.

+0

Come nota a margine, windows vista + supporta i file .ico che sono in realtà in formato PNG. Per te funziona? http://blogs.msdn.com/b/oldnewthing/archive/2010/10/22/10079192.aspx – MerickOWA

+0

A meno che non ci sia qualche utilità/funzione in .NET che possa essere usata per creare un .ico da un PNG sul vola ... Buono a sapersi, comunque. – devios1

+0

@chaiguy hai guardato usando http://www.hardcodet.net/projects/wpf-notifyicon per fare roba di sistema WPF? – MerickOWA

risposta

6

È possibile scrivere

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 fuori tema qui, ma congratulazioni per l'elezione del moderatore, @SLaks! –

+0

Il problema qui è che GetHIcon() è un metodo di Bitmap, non ImageSource, e non sembra essere un modo sano di ottenere una bitmap da un ImageSource - l'unico metodo che ho trovato (che era lungo circa 20 righe) non conserva la trasparenza PNG. – devios1

1

sto cercando questo ~ Qui è uno, ma non molto buono!

 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(); 
Problemi correlati