Как я могу получить значок из PNG-изображения? - PullRequest
19 голосов
/ 21 декабря 2008

Я создаю приложение WPF, поэтому я в основном работаю с классом ImageSource для иконок. Однако значок на панели задач должен иметь тип System.Drawing.Icon. Можно ли создать такой объект из png-изображения?

Я пробовал следующее:

private static System.Drawing.Icon _pngIcon;
public static System.Drawing.Icon PngIcon
{
    get
    {
        if (_pngIcon == null)
        {  
            //16x16 png image (24 bit or 32bit color)
            System.Drawing.Bitmap icon = global::BookyPresentation.Properties.Resources.star16;
            MemoryStream iconStream = new MemoryStream();
            icon.Save(iconStream, System.Drawing.Imaging.ImageFormat.Png);
            iconStream.Seek(0, SeekOrigin.Begin);
            _pngIcon = new System.Drawing.Icon(iconStream); //Throws exception
        }
        return _pngIcon;
    }
}

Конструктор Icon создает исключение со следующим сообщением: «Аргумент 'picture' должен быть изображением, которое можно использовать в качестве Icon."

Я подумал, что это может быть что-то с битовой глубиной цвета изображения, поскольку у меня были некоторые проблемы с этим ранее, но 32-битные и 24-битные изображения не работали. Возможно ли то, что я пытаюсь сделать?

Ответы [ 7 ]

18 голосов
/ 22 декабря 2008

Я думаю, что вы можете попробовать что-то подобное, прежде чем конвертировать ваше изображение в .ico:

    var bitmap = new Bitmap("Untitled.png"); // or get it from resource
    var iconHandle = bitmap.GetHicon();
    var icon = System.Drawing.Icon.FromHandle(iconHandle);

Где icon будет содержать значок, который вам нужен.

9 голосов
/ 24 декабря 2008

Есть также веб-сайт (http://www.convertico.com/), который преобразует PNG в ICO.

3 голосов
/ 22 декабря 2008

.NET-проект называется IconLib .

public void Convert(string pngPath, string icoPath)
{
    MultiIcon mIcon = new MultiIcon();
    SingleIcon sIcon = mIcon.Add("Icon1");
    sIcon.CreateFrom(pngPath, IconOutputFormat.FromWin95);
    mIcon.SelectedIndex = 0;
    mIcon.Save(icoPath, MultiIconFormat.ICO);
}
3 голосов
/ 22 декабря 2008

Значки представляют собой комбинацию из 3 или 4 размеров изображения:

48 × 48, 32 × 32, 24 × 24 (необязательно) и 16 × 16 пикселей.

И может / должен также содержать три различных глубины цвета:

  • 24-битный с 8-битным альфа (32-битным)
  • 8 бит (256 цветов) с прозрачностью 1 бит
  • 4-битный (16 цветов) с 1-битной прозрачностью

Таким образом, поток памяти .png не помещается в конструктор иконки. Фактически, если вы прочтете примечания по другим перегрузкам конструктора , вы увидите все измерения «Размер» или «Ширина и высота» для поиска значка правильного размера в файле.

Дополнительную информацию о создании значков вручную можно найти в разделе " Создание значков Windows XP "

1 голос
/ 12 августа 2016

Попробуйте это работает для меня,

window.Icon = BitmapFrame.Create(Application.GetResourceStream(new Uri("YourImage.png",
UriKind.RelativeOrAbsolute)).Stream);
1 голос
/ 22 декабря 2008

Вы можете установить ImageSource значка окна на изображение PNG, и оно работает, как ни странно. Я не проверял это для значков в трее.

0 голосов
/ 22 декабря 2008

Вы можете попробовать небольшое приложение командной строки под названием png2ico . Я использую его для создания иконок Windows из pngs.

...