在创建网站的时候,通常会需要一个 Favicon 图标,以便在浏览器的地址栏(或标签上)、收藏夹等处显示网站的小标志,或者当用户创建网站的快捷方式到桌面(或浏览器)时显示网站大点的标志。

本文要介绍的是一款名为 icotool 的命令行工具,它可以非常方便地对 ICO 格式图标进行创建、查看和抽取。不过在进入正题之前,先来详细了解一下 Favicon 图标的来龙去脉。

一、Favicon 图标的历史和标准化

首次支持 Favicon 图标的浏览器是 1999 年 3 月微软推出的 Inernet Explorer 5(IE5)。一开始,Favicon 图标是存放在网站根目录的一个名为 favicon.ico 的文件,当页面被加入书签后,IE 会在收藏夹(书签栏)和地址栏的 URL 旁边显示此图标。后来,不论网站是否被加入书签,现代浏览器都在网站地址栏显示 Favicon 图标了。

W3C 在 1999 年 12 月发布的 HTML 4.01 推荐标准和后来在 2000 年发布的 XHTML 1.0 推荐标准中对 Favicon 做了标准化。标准实现是在文档的 <head> 部分使用带有 rel 属性的 link 元素指定文件格式、文件名以及文件路径。和以前实现方案不同的是,文件可以是任意格式,能放在网站的任何目录。

2003 年,ICO 格式由第三方在 IANA 注册成了 MIME 类型 image/vnd.microsoft.icon。但是当把 ICO 格式作为图片显示时(不作为 Favicon 图标显示),IE 浏览器无法显示使用标准化 MIME 类型提供的文件。IE 的解决方法是将 .ico 与 Web 服务器中的非标准化 MIME 类型 image/x-icon 相关联。

RFC 5988 创建了 IANA 链接关系注册表,并在 2010 年基于 HTML5 规范注册了rel="icon"。流行用法 <link rel="shortcut icon" type="image/png" href="image/favicon.png"> 理论上确定了两种关系:shorcuticon,但其中 shortcut 未注册,并且是多余的。2011 年 HTML 活动标准(HTML living standard)明确说明,鉴于历史原因,允许紧邻 icon 之前使用 shortcut(两者之间用一个空格间隔),然而文中并未说明使用 shortcut 的意义。

二、浏览器对 Favicon 图标的实现

虽然 Favicon 图标的标准实现声称支持任意格式,但是浏览器对不同格式的实现却不尽相同。下表是主流网页浏览器对 Favicon 文件格式的支持情况:

浏览器 ICO PNG GIF 动态GIF JPEG APNG SVG
Chrome 支持 支持 4.0 起支持 不支持 4.0 起支持 不支持 不支持
Edge 支持 支持 支持 不支持 未知 未知 未知
IE 5.0 起支持 11.0 起支持 11.0 起支持 不支持 不支持 不支持 不支持
Firefox 1.0 起支持 1.0 起支持 1.0 起支持 支持 支持 3.0 起支持 41.0 起支持
Opera 7.0 起支持 7.0 起支持 7.0 起支持 7.0 起支持 7.0 起支持 9.5 起支持 44.0 起支持
Safari 支持 4.0 起支持 4.0 起支持 不支持 4.0 起支持 不支持 12.0 起支持

在这些格式中,最常用的是 ICO 格式,也是在歌中浏览器中兼容性最好的一种格式。ICO 格式是一种在 Windows 系统中作为图标使用的图像格式,比如在桌面、开始菜单以及资源管理器中,所有可执行程序都带有 ICO 格式的图标。ICO 一种容器格式,可以包含一个或多个不同尺寸和色彩深度的图标,以便在使用时适时缩放。其中图像的像素大小可以是 16*16、32*32、48*48、64*64、128*128、256*256 等任何你需要的尺寸(包含图像越多文件就越大),色彩深度可以是 8 位、24 位 或 32 位。

由于浏览器的用户界面各不相同,所以显示 Favicon 图标的位置也有所区别。下表是主流网页浏览器对显示 Favicon 图标位置的支持情况:

浏览器 地址栏 地址栏下拉菜单 链接栏 书签 标签 桌面快捷方式
Chrome 不支持 不支持 支持 支持 1.0 起支持 不支持
IE 7.0 起支持 不支持 5.0 起支持 5.0 起支持 7.0 起支持 5.0 起支持
Edge 不支持 支持 支持 支持 支持 支持
Firefox 1.0-12.0 期间支持
13.0 起不支持
支持 支持 支持 支持 支持
Opera 7.0-12.17 期间支持
14.0 起不支持
不支持 7.0 起支持 7.0 起支持 7.0 起支持 7.0 起支持
Safari 支持 支持 不支持 支持 12.0 起支持 不支持

如前所述,Favicon 图标的标准实现是在网页文档的 <head> 部分使用带有 rel 属性的 link 元素指定文件格式、文件名以及文件路径。以下是 Chrome、IE、Edge、Firefox、Opera 和 Safari 对不同实现的支持情况:

<link rel="shortcut icon" href="https://example.com/myicon.ico">
<link rel="icon" type="image/svg+xml" href="https://example.com/image.svg">

▲ 此上两种方式所有浏览器均支持

<link rel="icon" type="image/vnd.microsoft.icon" href="https://example.com/image.ico">
<link rel="icon" type="image/x-icon" href="https://example.com/image.ico">

▲ 此上两种方式 IE 浏览器在 IE9 之后支持

<link rel="icon" href="https://example.com/image.ico">
<link rel="icon" type="image/gif" href="https://example.com/image.gif">
<link rel="icon" type="image/png" href="https://example.com/image.png">

▲ 此上三种方式 IE 浏览器在 IE11 之后支持

<link rel="mask-icon" href="https://example.com/image.svg" color="red">

▲ 此方法只有 Safari 浏览器支持。

当前的 HTML5 规范推荐使用 <link> 标签的属性 rel="icon" size="使用空格分隔的尺寸数值"为图标指定多种尺寸。还可以通过在 <link> 标签内使用属性 type="文件内容类型" 提供包括类容器格式(如微软的 .icon 和 Mac 系统的 icns)以及矢量图形在哪的多种图标格式。

主流浏览器会优先识别 link 元素指定的 Favicon 图标,若没有指定,浏览器会尝试读取网站根目录的 favicon.ico 文件,如果不存在会出现找不到 favicon.ico 的 404 错误(一定程度上影响页面载入速度)。

如果使用了两个 link 元素同时指定了 ICO 和 PNG 格式的 Favicon 图标,不同浏览器在识别它们时优先级会有所不同:Firefox 始终会优先使用 ICO 格式。Chrome、Safari、Opera 会优先使用像素尺寸为 32*32、16*16 的格式,否则会使用 ICO 格式。

三、使用 icotool 创建 Favicon 图标

制作 ICO 图标有很多种方法,这里介绍的是利用 icotool 这款工具创建图标的方法。

icotool 是一款专门处理图标文件(后缀为 .icon)和光标文件(后缀为 .cur)的命令行工具,可在类 Unix 系统(如 Linux、macOS)中使用。本文只介绍图标相关的功能。

icotool 其实是套装命令行程序 icoutils 中的一个工具,所以想要使用它,需要安装 icoutils。在 macOS 系统中可以直接使用 Homebrew 安装:brew install icoutils

安装好 icoutils 之后,可以使用命令 man icotool 查看 icotool 的使用说明。从中可以看到 icotool 有三种模式:列出(list)、提取(extract)和创建(create)。每种模式都有一些可选的参数。

1、列出 ICO 图标包含的图片

列出模式是指在命令行上列出指定 ICO 文件所包含的所有图片,其用法如下(-l 可换成 --list):

icotool -l /path/to/favicon.ico

如操作无误,在命令行上就可以显示出如下所示的图片列表:

--icon --index=5 --width=16 --height=16 --bit-depth=8 --palette-size=256
--icon --index=4 --width=24 --height=24 --bit-depth=8 --palette-size=256
--icon --index=3 --width=32 --height=32 --bit-depth=8 --palette-size=256

默认情况下该命令会列出 ICO 图标包含的所有图标,你也可以通过以下可选参数过滤列出结果:

  • -i--index=N:列出指定索引编号的图片
  • -w--width=PIXELS:列出指定宽度是的图片
  • -h--height=PIXELS:列出指定高度的图片
  • -b--bit-depth=COUNT:列出指定颜色深度的图片(可用项位 1、2、4、8、16、24 和 32)
  • -p--palette-size=PIXELS:列出指定色彩范围的图片(24、32 位图片不可用)
  • --icon:只处理有效的 ICO 格式文件

注意,创建图标时,如果 PNG 带有透明部分,颜色深度将自定设定为 32 位。

2、提取 ICO 图标包含的图片

提取模式是指把 ICO 文件中的图片提取出来,其用法如下(-x 可换成 --extract):

icotool -x /path/to/favicon.ico

如操作无误,就可以在被提取 ICO 文件所在目录看到如下所示的三张图片:

  • favicon_1_16x16x8.png
  • favicon_2_24x24x8.png
  • favicon_3_32x32x8.png

默认情况下该命令会把 ICO 文件中的所有图片都提取出来,你可以像列出功能那样,使用可选参数来提取符合条件的图片,如索引编号、宽度、高度等。

此外你还可以使用 -o--output=PATH 参数指定存放提取图片的路径。

3、用指定图片创建 ICO 图标

创建模式则是通过将现成的单张或多张 PNG 图片转制成 ICO 格式的图标文件。下面是它的具体用法。

在使用 icotool 创建 ICO 图标之前,可以先用图形处理软件(如 PhotoShop)制作好单张的 PNG 图标。

作 Favicon 用的 ICO 图标一般只需要包含 16*16、24*\24、32*32 这三种尺寸就够了(如果考虑到大图标的使用场景也可以加入一个 128*128 的尺寸,不过这会导致创建的 ICO 图标比较大),如下所示:

  • f16.png
  • f24.png
  • f32.png

单张图标准备好之后,就可以使用如下命令将这些图片转制成 ICO 图标了(-c 可换成 --create):

icotool -c f16.png f24.png f32.png -o favicon.ico

注意,这里也和提取命令一样使用了参数 -o,用来指定转制的 ICO 文件存放路径。

在创建图标的时候,可以附加几个可选参数:

  • -b--bit-depth=COUNT:为图片指定颜色深度。可以使用一次为所有图片指定色深,也可使用多次为每一个图片指定色深(这种情况下需要为每一张图片都指定色深)
  • -t--alpha-threshold=LEVEL:在创建图标时,为 PNG 图片要变成透明的部分指定最大 Alpha 级别。默认值是 127(范围 0~255)。一般是在把含 Alpha 通道的色深为 32 的图片转换成色深为 24 的图片时使用,它可以把指定 Alpha 级别以内的像素变成完全透明的(其它则不透明)。
  • -r--raw=FILENAME:将输入文件以原始 PNG 的形式存储(Vista 图标)。默认情况下程序会自动优化输入的 PNG 图片,对于不想要处理的 PNG 就可以使用此参数指定。用法如下所示:
icotool -c -r f16.png -r f24.png f32.png -o favicon.ico

这段代码的意思是,除了 f32.png 其它 PNG 图片都会以原始的形式存入生成的图标中。


补充:iOS 对图标的特殊用法

苹果的 iOS 系统没有采用 HTML 推荐标准,而是用专有方法 apple-touch-icon 实现。此方法可以让用户利用 Safari 分享功能上的【添加到主屏幕(Add to Home Screen)】把网站图标添加到主屏上。

此方法要求图标文件必须是 PNG 格式,并可通过两种方式实现。一种是通过在网页 <head> 部分添加 <link rel="apple-touch-icon" href="/custom_icon.png"> 指定图标文件。另一种是在网站根目录添加名为 apple-touch-icon 为或以其为前缀的图标文件,如果没有使用 link 元素指定图标,系统会自动搜索这些图标文件。如果这两种方式没有使用,系统会用网页的缩略图作为图标。

在图标尺寸方面,iPad 的推荐基准尺寸是 152*152 像素,iPhone 的基准尺寸是 180*180 像素(参考 iOS 当前图标尺寸标准)。在指定图标时,可以根据设备分辨率的不同,指定不同尺寸的图标。例如,为了同时支持 iPhone 和 iPad 设备,可以像下面这样为每个 link 元素添加 sizes 属性:

<link rel="apple-touch-icon" href="touch-icon-iphone.png">
<link rel="apple-touch-icon" sizes="152x152" href="touch-icon-ipad.png">
<link rel="apple-touch-icon" sizes="180x180" href="touch-icon-iphone-retina.png">
<link rel="apple-touch-icon" sizes="167x167" href="touch-icon-ipad-retina.png">

如果系统没有找到设备的推荐尺寸图标,会使用比推荐尺寸大的图标,如果仍然没有,就使用当前图标中最大的那一个。例如,如果设备的推荐图标尺寸是 58*58,系统会按照如下顺序搜索文件名:

apple-touch-icon-80x80.png
apple-touch-icon.png

iOS 会自动把图标转换成圆角形式。在 iOS7 之前还会为图标添加投影和高光(如果不想添加这些效果需要为图标文件名末尾附加 -precomposed)。


参考资料:


Category: Tags: