2013-06-27 15 views
6

Może to bardzo łatwy problem do rozwiązania, ale nie znalazłem jeszcze idealnego rozwiązania. Próbuję przekonwertować PNG do ICO z C# i znalazł pytanie converting .PNG to .ICO in C/C# jakiego rodzaju daje roztwór roboczy jak poniżej:Konwersja png na wysokiej jakości 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); 
} 

dla własnego projektu I zmieniły to podejście nieco do:

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

Problem, którego doświadczam, polega na tym, że wynikowe ico jest niskiej jakości, domyślam się, że zostało zmienione na 16x16 i straciło część jego głębi kolorów, może teraz ma tylko 16 kolorów? Jak mogę przekonwertować plik ICo wyższej jakości?

+0

Możesz spróbować: https://gist.github.com/darkfall/1656050. Mogę ci powiedzieć, że będziesz potrzebował czegoś mocniejszego niż "GetHicon", ponieważ jest to szybka i brudna metoda, która w żadnym wypadku nie ma być bezstratna. – DonBoitnott

+0

@DonBoitnott, proszę zaksięguj swój komentarz jako odpowiedź. Wymyśliłem, że działam zgodnie z Twoją sugestią i uważam, że jest to poprawna odpowiedź. – Bazzz

Odpowiedz

7

wierzę, że będzie potrzebują bardziej niezawodnej metody niż GetHIcon(). Jest to bardziej "szybka i brudna" opcja, w żadnym wypadku bez strat.

Oto przykład klasy, które można zachować jakość obrazu na drodze do konwersji jak ICO:

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

+0

Skrypt Gr8 działa jak zaklęcie, ale trafiam "Błąd operacji arytmetycznej spowodował błąd przepełnienia", jeśli próbuję wygenerować ikonę o wysokości większej niż 255 .. prawdopodobnie z powodu maksymalnie dozwolonej wartości CBYTE() wynosi 255 - czy masz jakiekolwiek obejście/sugestie dotyczące tworzenia wysokiej jakości ikon za pomocą kodu? – VarunC

2

W zadanym pytaniu przyjęte rozwiązanie wykorzystuje imagemagick, który jest doskonałym narzędziem do obróbki zdjęć, które daje możliwość kontrolowania rozmiaru, głębi kolorów itp. Podczas konwersji z png na ico. Naprawdę chciałbym zasugerować próbowanie tego rozwiązania.

Korzystanie z narzędzia ImageMagick wyglądałyby

konwertować -resize x16 centrum -gravity -crop 16x16 + 0 + 0 input.png \ -flatten -colors 256/wyjście Favicon.ico

(można wtedy kontrolować -resize i -colors aby osiągnąć to, czego szukasz.)

Te same opcje powinny być dostępne programowo w C# przez http://imagemagick.codeplex.com

+0

Przepraszamy za to, że nie wspomniałem o tym w pytaniu, ale wolałbym nie być zależny od zewnętrznych bibliotek, jeśli to możliwe. Rozważę twoją sugestię, jeśli wszystko inne zawiedzie. – Bazzz

Powiązane problemy