前面说过我用WPF写了一个NTP同步时间的桌面应用程序NTPClock,程序发布后应该选择一个.ico作为图标,于是我找了一个png文件,在Photoshop里面把它转为了.ico文件,保存为256*256分辩率大小。程序发布后,明显能感觉到图标的周围有锯齿,对比下图CCleaner这个图标,这个NTPClock的图标显得非常不专业,作为一个吹毛求疵的码农,不能忍。

▲ 中等图标大小下,NTPClock的快捷方式图标存在明显的锯齿

    ico文件可以存储单个图案、多尺寸、多色板的图标。一个图标实际上是多张不同格式的图片的集合体,并且还包含了一定的透明区域。Window系统中根据用户选择的显示大小(如下图),会从ico文件里找对应分辨率大小,没有对应的就会压缩大的,这种压缩会导致不清晰且锯齿明显(天知道为啥大分辨率压缩成小分辨率会变模糊)。

  ▲Windows查看,可以选择图标大小,可以看到大图标下,NTPClock没有做这方面的适配

    我们使用软件,打开CCleaner.exe文件,可以看到他的ico文件其实是包含多个不同分辨率的文件。

    使用该软件打开NTPClock.exe,可以看到,这个ico文件只有一个大小:

解决方法


    那如何生成一个合格的ico文件呢?使用Photoshop直接将png格式转为ico格式这种土办法显然是不专业的,专业的事情需要专业的软件来做,这个软件的名字就叫做IconWorkshop,当然还有其它的软件,这里以IconWorkshop为例。

    首先,准备好图标要使用的png文件,之所以使用png图片是因为能够背景透明。然后使用该软件打开该png文件,该png文件我调整为了512*512大小。

    然后,在Edit->“New Windows Ico Project from this Image”,从该png文件生成一个ico项目。

    在打开的项目中,选择需要生成ico图标的一系列尺寸:

    最后点击OK,然后在File->“Save as”保存,默认就会保存为ico文件,文件名为项目名称。

     得到这个ico文件之后,将它设置为项目的ico文件,重新编译发布,就大功告成了。