2013-06-27 9 views
6

Forse questo è un problema molto facile da risolvere ma non ho ancora trovato la soluzione perfetta. Sto cercando di convertire un PNG ICO con C# e ha trovato la domanda converting .PNG to .ICO in C/C# che tipo di dà una soluzione di lavoro, come di seguito:Converti png in alta qualità ico

using (FileStream stream = File.OpenWrite(@"C:\temp\test.ico")) 
{ 
    Bitmap bitmap = (Bitmap)Image.FromFile(@"c:\temp\test.png"); 
    Icon.FromHandle(bitmap.GetHicon()).Save(stream); 
} 

Per il mio progetto ho cambiato questo approccio leggermente a:

string pngFile = "path/to/pngfile"; 
using (Bitmap bitmap = new Bitmap(pngFile)) 
{ 
    using (Icon icon = Icon.FromHandle(bitmap.GetHicon())) 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
     icon.Save(stream); 
     // something interesting with icon here 
     } 
    } 
} 

Il problema che sto vivendo è che l'ico risultante è di scarsa qualità, immagino che sia ridimensionato a 16x16 e abbia perso parte della profondità del colore, forse ora ha solo 16 colori? Come posso convertire in un file ico di qualità superiore?

+0

Si potrebbe provare: https://gist.github.com/darkfall/1656050. Posso dirti che avrai bisogno di qualcosa di più robusto di "GetHicon" perché è un metodo veloce e sporco, e in nessun modo destinato a essere privo di perdite. – DonBoitnott

+0

@DonBoitnott si prega di inviare il tuo commento come risposta. Ho maneggiato per farlo funzionare con il tuo suggerimento e credo che questa sia la risposta corretta. – Bazzz

risposta

7

credo che sarà bisogno di un metodo più robusto rispetto a GetHIcon(). È più un'opzione "veloce e sporca", e per niente senza perdite.

Ecco un esempio di una classe che può preservare la qualità dell'immagine sulla strada per la conversione come ICO:

https://gist.github.com/darkfall/1656050

+0

Lo script Gr8 funziona come un incantesimo, ma sto premendo 'Operazione aritmetica ha provocato un errore di overflow' se provo a generare un'icona con altezza maggiore di 255 .. probabilmente a causa di CBYTE() massimo consentito è 255 - hai qualche soluzione/suggerimenti per realizzare icone di alta qualità usando il tuo codice? – VarunC

2

Nella domanda di riferimento la soluzione accettata utilizza imagemagick, che è un ottimo strumento di manipolazione delle immagini che ti dà la possibilità di controllare le dimensioni, la profondità del colore ecc. Durante la conversione da png a ico. Vorrei davvero suggerire di provare questa soluzione.

Utilizzando l'utilità di ImageMagick sarebbe simile

convertire -resize x16 centro -gravity -crop 16x16 + 0 + 0 input.png \ -flatten -colors 256 uscita/favicon.ico

(si potrebbe quindi controllare -resize e -colors per ottenere ciò che si sta cercando.)

Le stesse opzioni dovrebbero essere disponibili a livello di codice in C# tramite http://imagemagick.codeplex.com

+0

Ci scusiamo per non averlo menzionato nella domanda, ma preferirei non dipendere da librerie esterne se possibile. Considererei il tuo suggerimento se tutto il resto fallisse. – Bazzz