ICO 图标这事,我踩过的坑


做桌面应用的时候,图标这个东西看着简单,真弄起来全是坑。这篇文章把我折腾了一下午的经验整理一下,给后面的人省点时间。

ICO 到底是什么

ICO 是 Windows 的图标格式。跟 PNG 不同,一个 .ico 文件可以同时包含多个尺寸的图标。你传一个 256 的给系统,Windows 会在不同场景自动挑合适的尺寸用。所以桌面应用一般要求一个文件里 16 到 256 全部有。

桌面应用和网页图标的区别

这两件事经常被混在一起说,其实是两套做法。

桌面应用 ICOWeb Favicon
格式.ico(多尺寸打包).ico.png,现在主流用 PNG
尺寸16~256 全装在一个文件按场景单独提供,最常用 32x32
大尺寸256x256180x180(Apple)、192/512(Android Chrome)
做法一个 .ico 搞定每个尺寸单独一个 .png,HTML 里声明

桌面应用要的是"全尺寸 ICO",也就是 16、32、48、64、128、256 这 6 个尺寸都在一个文件里。Web 则反过来,现在没人折腾 ICO 了,直接放几个 PNG 就行。

桌面应用的全尺寸 ICO

各个尺寸的用途:

尺寸用途
16x16标题栏、小图标
32x32标准窗口图标
48x48任务栏、文件管理器列表
64x64大图标视图
128x128macOS、大缩略图
256x256Windows 最大尺寸(PNG 压缩)

源图建议至少 512x512,最好是 1024x1024,正方形,透明背景 PNG。

ImageMagick 最省心

# 安装
brew install imagemagick

# 生成全尺寸 ICO
magick icon.png -define icon:auto-resize=256,128,64,48,32,16 icon.ico

注意 ImageMagick 7 里 convert 命令已经废弃了,要用 magick

Pillow 有坑,别用它

Pillow 的 save 方法在保存多尺寸 ICO 上有已知 bug,sizes 参数和 append_images 都可能只保存第一个尺寸。我用的时候 file 一验证,就 1 个 icon,白折腾。要省事就上 ImageMagick。

在线工具

传一张 PNG 上去,自动给你生成多尺寸 ICO。

怎么验证是不是全尺寸

file icon.ico
# 输出:icon.ico: MS Windows icon resource - 6 icons, 256x256, ...

看到 6 icons 就对了。有时候输出里会出现负数尺寸,比如 -128x-128,别慌,那只是表示这一层用的是 PNG 压缩存储,正常现象。

Wails 项目里怎么用

cp icon.ico your-app/build/app.ico

Wails 在 wails build 的时候会自动把图标打进二进制里。

Web 端 Favicon 的正确姿势

Web 的思路是反过来:按场景准备几个独立 PNG,在 HTML 里声明清楚。

常用尺寸:

尺寸用途
16x16浏览器标签页
32x32浏览器标签页(Retina)
180x180Apple Touch Icon(iOS 桌面快捷方式)
192x192Android Chrome
512x512Android Chrome 启动屏

HTML 里这样声明:

<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">

Android Chrome 需要配合 site.webmanifest

{
  "icons": [
    { "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" },
    { "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" }
  ]
}

如果你懒得搞这么多,一个 32x32 的 PNG 其实也够了:

<link rel="icon" href="/favicon.png">

批量生成就用这一串:

magick icon.png -resize 16x16 favicon-16x16.png
magick icon.png -resize 32x32 favicon-32x32.png
magick icon.png -resize 180x180 apple-touch-icon.png
magick icon.png -resize 192x192 android-chrome-192x192.png
magick icon.png -resize 512x512 android-chrome-512x512.png

总结一下踩过的坑

  1. Pillow 写多尺寸 ICO 有 bug,sizesappend_images 可能只保存第一个尺寸,file 一验证只有 1 icon。遇到这种问题直接换 ImageMagick。
  2. IMv7 里 convert 已废弃,用 magick
  3. file 输出里的负数尺寸(如 -128x-128)是 PNG 压缩存储,不是错误。
  4. Web 场景不需要 ICO,现代浏览器都支持 PNG favicon。ICO 主要是桌面应用的需求。

最核心的经验就一条:桌面用 ImageMagick 一条命令生成全尺寸 ICO,Web 端按尺寸准备 PNG 再用 HTML 声明。剩下的细节都在上面了。

声明:Grows towards sunlight |版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - ICO 图标这事,我踩过的坑


Grows towards sunlight and Carpe Diem