如何从PNG图像中获取图标?

25

我正在创建一个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'必须是可用作图标的图片。"

我认为这可能与图像颜色的位深度有关,因为我之前遇到过一些问题,但是32位和24位的图像都没有起作用。我正在尝试的操作可能行不通吗?

7个回答

21

在将图像转换为 .ico 格式之前,我认为你可以尝试类似于以下的方法:

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

变量icon将包含您所需的图标。


4
使用这种方法,我只能获得16种颜色的图标。 - Anthony Johnston
请记得释放图标资源,参考以下链接:https://dev59.com/JYzda4cB1Zd3GeqPjjqr#33801377 - Vilhelm

8

或者你可以像 OP 要求的那样使用 C#,new Bitmap("bla.png").GetHicon() - undefined
@GottZ - 但是OP并没有要求C#的解决方案。他提供了代码,因为那是他正在做的事情,但他的问题是“如何获取一个System.Drawing.Icon类型的图像文件,用于他的WPF项目”,特别是从现有的PNG文件中获取。将近12年前,那个网站就可以完成这个特定的任务,因为我当时就用它来完成这个任务。 - undefined

5

图标是由三到四种不同大小的图片组合而成:

48 × 48、32 × 32、24 × 24(可选)和 16 × 16 像素。

并且还应该包含三种不同的颜色深度:

  • 24 位带 8 位 alpha(32 位)
  • 8 位(256 种颜色)带 1 位透明度
  • 4 位(16 种颜色)带 1 位透明度

因此,.png 内存流不会适合于图标的构造函数中。实际上,如果您阅读其他构造函数重载的注释,您将看到所有用于查找文件中正确大小图标的 "Size" 或宽度高度测量。

关于手动创建图标的更多信息,请参见 "创建 Windows XP 图标"。


4

我建议你试一下,对我来说有效,

window.Icon = BitmapFrame.Create(Application.GetResourceStream(new Uri("YourImage.png",
UriKind.RelativeOrAbsolute)).Stream);

对我来说,只需进行小修改就可以运行:BitmapFrame.Create(Application.GetResourceStream(new Uri(@"pack://application:,,,/Folder/YourImage.png", UriKind.RelativeOrAbsolute)).Stream) - Mike F

4

There is a .NET project called 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);
}

1

你可以将窗口图标的ImageSource设置为PNG图像,它会奇迹般地工作。不过我还没有验证托盘图标是否也适用。


0
你可以尝试使用一个小型的命令行应用程序png2ico。我使用它从PNG文件创建Windows图标。

我尝试过那样做,但它完全破坏了透明区域边缘的图像。 - Morten Christiansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接