图片

图片格式对比

图片格式/特性颜色表支持真彩色支持压缩方式动画支持透明度支持半透明度浏览器兼容性
JPG有损压缩所有
GIF有损/无损压缩所有
PNG-8无损压缩所有(IE8以下可兼容处理)
PNG-24无损压缩所有(IE8以下可兼容处理)
PNG-32无损压缩所有(IE8以下可兼容处理)
SVG待确认待确认无损压缩所有(IE9及以下课通过降级兼容)
WebP待确认待确认有损压缩待确认支持 chromium 内核浏览器和 Android 4.0+, 其他版本和 iOS 可插件兼容
图片格式适用场景
JPG适用于层次丰富、色彩较多的照片、摄影等图像
GIF适用于图像动画,兼容性好;体积小,适合网络传输;
PNG适用于色彩简单、对比强烈的图像,像 icon 图标等;高保真效果,高压缩比,支持透明;支持渐进传输,整体从模糊到清晰
SVG矢量图形,可缩放;无需多端、多分辨率适配;支持多种编辑,具有较强的交互特性;
WebP高压缩比,适合网络快速传输

说明

  • 颜色表支持是指,每张图片都自带一张具有有限数量颜色的颜色表,图片里的颜色只能是颜色表里的颜色。因此,相同尺寸的图片,颜色表的颜色数越少,文件体积越小。

  • 真彩色支持是指,可以支持大约 1670 万种颜色。需要 3 个字节记录 1 个像素,红、绿、蓝三原色各占 1 个字节,即支持224种颜色,约 1670 万种。

  • SVG: CSS 背景图片支持度open in new windowHTML 图片元素支持度open in new window

  • 非特殊情况,尽量不要用 PNG-24 和 PNG-32。

首先,Logo、图标等小图片,整张图片一般不多于256色,因此当然选择带颜色表的图片格式。而事实证明,对于同一张图,PNG-8 的体积是小于 GIF 的。因此,若不是动画,小图片请用 PNG-8。

然后,照片、横幅等大图,就像在线听歌一样。如果在线听无损音乐,那得很大的带宽才行。我们在线试听歌曲,目的就是听听这首歌,不会非常注重音质(而且我的木耳是听不出MP3和无损的区别的)。同样道理,放在网页中的大图,用户肯定不会太看重画质,能看清楚内容就行。因此,照片大图用有损压缩的JPG。

根据经验,JPG的画质一般选择 60% - 70%。当然如果你要求较高,可以在PS里一边看预览一边慢慢调整直到自己满意。

JPG

  • 不支持颜色表
  • 也不支持透明
  • 只有真彩色
  • 有损压缩

连续的 JPG

Photoshop 里保存 JPG 格式时有个“连续”选项,路径为:PS CC2017:文件 → 存储为... → “JPG”格式 → 保存

“基线”格式的JPG加载过程:从上往下

“基线”格式的JPG加载过程:从上往下

“连续”格式的JPG加载过程:从模糊到清晰

“连续”格式的JPG加载过程:从模糊到清晰

PNG

  • PNG-8
    • 1 个字节记录一个像素:能有 256 种颜色
    • PNG-8 带颜色表,而且不像 BMP 只有固定的16色、256色,PNG-8 的颜色数可以从 2 种到 256 种之间任意种,像123种、10种颜色之类的颜色数,PNG-8 都是支持的。而且通过强大的压缩算法,PNG-8 可以真正做到颜色数越少,文件体积越小。
  • PNG-24
    • 3 个字节记录一个像素:红、绿、蓝三原色各占一个字节,总共大约 1670 万色,即真彩色
  • PNG-32
    • 4 个字节记录一个像素:在 PNG-24 的基础上,增加透明通道,占 1 字节,从 0~255 表示从 全透明 -> 半透明 -> 不透明

GIF

  • 带颜色表,最多支持 256 色,也支持 256 以内任意数量的颜色表
  • 不支持真彩色
  • 帧动画

颜色表

16色(1 个字节记录 2 个像素)、256色(1 个字节记录 1 个像素,比如 PNG-8)图片文件除了存储每个像素之外,还会存储一份颜色表(Palette,亦译作调色板、色盘),从真彩色的 1670 万种色彩里任意挑选 16、256 种颜色,构成一个索引。颜色表大概长这个样子:

0号色:#000000

1号色:#3385FF

...

255号色:#FAFEF2

以 PNG-8 为例,其能支持的颜色数量不是固定的 256 种,而是可以从 1670 万种颜色里选取 256 种。

图片的性能优化

  • 图片懒加载:在页面上的未可视区域可以添加一个滚动事件,判断图片位置与浏览器顶端的距离与页面的距离,如果前者小于后者,优先加载
  • 图片预加载:幻灯片、相册等可以使用技术,将当前展示图片的前一张和后一张优先下载
  • CSS Sprite,SVG Sprite,Iconfont,Base64
  • 如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提高用户体验
  • 如果图片展示区域小于图片的真实大小,则因在服务器端根据业务需要先行进行图片压缩,图片压缩后大小与展示一致

Reference

更多详情请见:JPG?GIF?PNG?前端如何选择图片格式?open in new window