2013-06-27 3 views
6

Возможно, это очень простая проблема для решения, но пока я не нашел идеального решения. Я пытаюсь преобразовать PNG в ICO с C# и нашел вопрос converting .PNG to .ICO in C/C# который вроде дает рабочий раствор, как показано ниже:Преобразование png в высокое качество 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); 
} 

Для моего проекта я слегка изменил этот подход:

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

Проблема, с которой я столкнулся, заключается в том, что в результате ico имеет низкое качество, я предполагаю, что он изменился до 16x16 и потерял часть его глубины цвета, возможно, теперь имеет только 16 цветов? Как я могу конвертировать в более качественный файл ico?

+0

Вы можете попробовать: https://gist.github.com/darkfall/1656050. Я могу сказать вам, что вам понадобится нечто более надежное, чем «GetHicon», потому что это быстрый и грязный метод и ни в коем случае не должен быть без потерь. – DonBoitnott

+0

@DonBoitnott, пожалуйста, напишите свой комментарий в качестве ответа. Я заставил его работать с вашим предложением, и я считаю, что это правильный ответ. – Bazzz

ответ

7

Я считаю, что вы будете нужен более надежный метод, чем GetHIcon(). Это скорее «быстрый и грязный» вариант, а отнюдь не потерянный.

Вот пример класса, который может сохранить качество изображения на пути преобразования в ICO:

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

+0

Скрипт Gr8 работает как шарм, но я нажимаю «Арифметическая операция, вызванная ошибкой переполнения», если я пытаюсь создать значок с высотой больше 255 .. Вероятно, из-за того, что CBYTE() максимально допустимо 255, у вас есть любой метод обхода/предложения для создания значков высокого качества с использованием вашего кода? – VarunC

2

В рассматриваемом вопросе принятое решение использует imagemagick, который является отличным инструментом обработки изображений, который дает вам возможность контролировать размер, глубину цвета и т. Д. При преобразовании из png в ico. Я бы действительно предложил попробовать это решение.

Использование утилиты ImageMagick будет выглядеть как

конвертировать -resize x16 -gravity центр -crop 16x16 + 0 + 0 input.png \ -flatten -Краски 256 Выход/favicon.ico

(вы могли бы контролировать -resize и -Краски добиться того, что вы ищете.)

Те же параметры должны быть доступны программно в C# через http://imagemagick.codeplex.com

+0

Извините, что не упомянул об этом в вопросе, но я бы предпочел не зависеть от внешних библиотек, если это возможно. Я бы рассмотрел ваше предложение, если все остальное не удастся. – Bazzz