图片之WebP
一、引言
在今日这个数字化高速发展的时代,网站已成为企业展示形象、推广产品、服务用户的重要窗口。而在构成网站的众多元素中,图片无疑扮演着举足轻重的角色。它们不仅能为网站增添视觉吸引力,还能直观地传达信息,提升用户体验。然而,随着高清、大图等视觉需求的不断增长,图片也成为影响网站性能的关键因素之一。今天主要探讨的就是图片格式的优化。
二、图片格式的发展历史
图片格式的发展历史是一个漫长而充满创新的过程,各种图片格式在不同时期被提出,以满足不同的需求和标准。以下是几种主要图片格式的发展历史
概念介绍
💡 无损、有损压缩:无损、有损压缩,是一个计算机术语,指数码图像文件压缩的两种类型。无损压缩是对文件本身的压缩,和其它数据文件的压缩一样,是对文件的数据存储方式进行优化,采用某种算法表示重复的数据信息,文件可以完全还原,不会影响文件内容,对于数码图像而言,也就不会使图像细节有任何损失。
有损压缩是对图像本身的改变,在保存图像时保留了较多的亮度信息,而将色相和色纯度的信息和周围的像素进行合并,合并的比例不同,压缩的比例也不同,由于信息量减少了,所以压缩比可以很高,图像质量也会相应的下降。
💡 透明:索引透明:及布尔透明,某一像素只有全透明或者全不透明两总效果,不能对透明度进行调整
alpha透明:可选透明度
- GIF (Graphics Interchange Format)
- 提出公司:CompuServe
- 提出时间:1987年
- 最先支持的浏览器:早期浏览器,如Mosaic(1993年发布,但GIF在此之前已存在)
- 特点:支持256种颜色,透明通道只有1 bit,文件压缩比不高,但支持多帧动画。
- 优点:压缩率高,支持动画效果,支持无损压缩。
- 缺点:颜色数量有限,不支持半透明效果。
- JPEG (Joint Photographic Experts Group)
- 提出组织:Joint Photographic Experts Group(JPEG小组)
- 提出时间:1992年
- 最先支持的浏览器:早期浏览器,如Mosaic(但JPEG的具体浏览器支持时间可能因浏览器版本而异)
- 特点:最常见的图片格式之一,支持有损压缩,以图像质量换取存储空间。
- 优点:支持多种颜色模式,压缩率高,支持有损压缩。
- 缺点:在压缩过程中会丢失部分信息,导致图像质量下降。
- PNG (Portable Network Graphics)
- 提出组织:PNG Development Group
- 提出时间:1995年(作为公开标准发布)
- 最先支持的浏览器:早期浏览器开始逐步支持,如Netscape Navigator(但具体支持时间可能因版本而异)
- 特点:无损压缩,支持完整的透明通道,旨在替代GIF。
- 优点:支持高质量压缩,支持透明度和alpha通道,支持多种颜色模式。
- 缺点:相对于JPEG格式,PNG文件的压缩率较低。
- SVG (Scalable Vector Graphics)
- 提出组织:W3C (World Wide Web Consortium)
- 提出时间:1999年
- 最先支持的浏览器:Mozilla的Firefox(以及其他一些浏览器,但Firefox是早期的主要支持者)
- 特点:基于矢量的图像格式,可以无限放大而不失真。
- WebP
- 提出公司:Google
- 提出时间:2010年
- 最先支持的浏览器:Google的Chrome(随后其他浏览器也开始支持)
- 特点:以VP8视频帧内编码为基础,提供更高效的压缩,旨在替代JPEG。
- 优点:相对于JPEG和PNG格式,WebP在相同质量下具有更高的压缩率。
- 缺点:目前部分浏览器和图像编辑软件可能不支持WebP格式。
| 文件类型 | 存储的颜色值 | 点阵(像素) | 有损/无损 | 透明 |
|---|---|---|---|---|
| GIF | 256 | 点阵图 | 无损 | 不支持半透明 |
| JPEG | 2^24 | 点阵图 | 有损 | 不支持透明 |
| PNG | 2^24 | 点阵图 | 无损 | 支持半透明 |
| SVG | 不受限 | 矢量图 | 无损 | 支持半透明 |
| WebP | 2^24 | 点阵图 | 无损、有损 | 支持半透明 |
三、Webp使用优势
WebP是谷歌开发的一种新图片格式,WebP是同时支持有损和无损压缩的、使用直接色的、点阵图。
从名字就可以看出来它是为Web而生的,什么叫为Web而生呢?就是说相同质量的图片,WebP具有更小的文件体积。现在网站上充满了大量的图片,如果能够降低每一个图片的文件大小,那么将大大减少浏览器和服务器之间的数据传输量,进而降低访问延迟,提升访问体验。
在无损压缩的情况下,相同质量的WebP图片,文件大小要比PNG小26%;
在有损压缩的情况下,具有相同图片精度的WebP图片,文件大小要比JPEG小25%~34%;
WebP图片格式支持图片透明度,一个无损压缩的WebP图片,如果要支持透明度只需要22%的格外文件大小。
四、可行性-案例
淘宝

花瓣网

五、Webp使用
问题–浏览器兼容性
目前直销系统中需要支持的版本:安卓>=5.0,ios>=9.0

结论:
安卓符合预期,可直接使用
IOS14以上才支持,需要有降级方案
浏览器Safari不支持,纯h5也需要有降级方案
兼容方案
纯前端判断是否支持webp:
- javascript方案
/** * 判断浏览器是否支持 webp */ // 方法1: 通过尝试加载一张 webp 格式的图片来判断 function isSupportWebp() {
const imgUrl = 'https://img.alicdn.com/imgextra/i2/O1CN01uvFm6B1XMMrTkObKV_!!6000000002909-0-tps-520-280.jpg_q75_.webp'; const image = new Image(); image.src = imgUrl; image.onload = function() {
// 加载成功,说明支持 webp return true; }
image.onerror = function() {
// 加载失败,说明不支持 webp return false; }
}
// 方法2: 通过判断 HTMLCanvasElement.toDataURL() 返回的 dataURI 来判断 function isSupportWebp() {
const str = document.createElement('canvas').toDataURL('image/webp'); // 如果支持则会返回传入的类型 image/webp --> data:image/webp;base64,UklGRtgCAABXRUJQVlA4WAoAAAAwAAAAKwEAlQAASUNDUBgCAAAAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANkFMUEgSAAAAAQcQEREQkCT+/x9F9D/tf0MAVlA4IIAAAABwDQCdASosAZYAPm02mUmkIyKhICgAgA2JaW7hdrEbQAnsA99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfasAAD+/9YAAAAAAAAAAA== // 如果不支持则会返回默认值 image/png --> data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAACWCAYAAABkW7XSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADGSURBVHhe7cExAQAAAMKg9U9tCF8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAONUAv9QAAcDhjokAAAAASUVORK5CYII return str.indexOf('image/webp') > -1; }
/** * 选择浏览器支持的图片格式 */ function getImg(compressedImg, originalImg) {
const isSupport = isSupportWeb(); return isSupport ? compressedImg : originalImg; }
- html方案
<picture>元素
利用浏览器会选择 `<picture>` 元素中最匹配的子 `<source>` 元素,如果没有匹配的,就选择 `<img>` 元素的 src 属性中的 URL 这一特点。如果浏览器支持 image/webp 类型的图片,则加载 `<source>` 元素中 srcset 属性指向的资源,如果不支持则跳过 `<source>` 元素,加载 `<img>` 元素。
- ios方案:
SDWebImage提供的WebP插件:SDWebImageWebPCoder;
YYImage提供的插件;
其他方案:
根据http响应头accept的值内是否包含webp格式判断浏览器是否支持webp格式
将其他图片格式转webp的方案
- 脚本/java Google提供的WebP Library 1webp library说明下载地址 2java编译jar包说明链接
- 前端打包工具 webpack
- js: canvas.toDataURL()
- nginx+lua+imageMagic