WebP 在减少图片体积和流量上的效果如何?—— WebP 技术实践分享

作者 | Jackson
编辑 | 尾尾

不论是 PC 还是移动端,图片一直占据着页面流量的大头,在图片的大小和质量之间如何权衡,成为了长期困扰开发者们的问题。而 WebP 技术的出现,为解决该问题提供了好的方案。本文将为大家详细介绍 WebP 技术,同时也会分享该技术在 MIP 项目)中的实践。

一、什么是 WebP ?

WebP 是由 Google 收购 On2 Technologies 后发展出来的图片格式,以BSD授权条款发布。目前已经在不同厂商之间进行了尝试,如Google、Facebook、ebay、百度、腾讯、淘宝等。

二、为什么选择 WebP?

1. WebP 的优势

WebP 在支持有损、无损、透明图片压缩的同时,大大减少了图片的体积。据统计,WebP 无损压缩后比 PNG 图片体积减少了 26%,有损图片比同类 JPEG 图像体积减少了 25%~34%,下面总结 WebP 在不同指标上所能获得的提升对比。

(1)体积和流量方面

根据业界给出的改造数据可知,改造 WebP 之后图片体积会降低很多,具体可参照 WebP 体积测试链接,同时也可参照下图。

图片

在 MIP 项目)中,通过我们的本地测试获得的数据如下图所示。

图片

从以上测试可知,如果将体积换算成带宽,WebP 不同模式下都会节省大量流量。科技博客 Gig‍‍‍aOM 曾报道,谷歌的 Chrome 网上应用商店采用 WebP 格式图片后,每天可以节省几 TB 的带宽;Google+ 移动应用采用 WebP 图片格式后,每天节省了 50TB 数据存储空间。

(2)速度方面

图片的加载速度还要取决于网络时间,所以我们没有测试确定的数据,不过可以参考业界的数据:科技博客 Gig‍‍‍aOM 曾报道,YouTube 的视频略缩图采用 WebP 格式后,网页加载速度提升了 10%;谷歌的 Chrome 网上应用商店采用 WebP 格式图片后,页面平均加载时间大约减少 1/3。

2. 兼容性

目前来说,WebP 的支持程度也在不断上升,据 2017年10月12日在 can i use 上的查询显示,全球 WebP 的支持程度已经达到 73.64%,如下图所示。

WebP 支持程度图解

而也正是因为这种天然的图片体积优势和发展趋势,MIP 团队也决定进行初步的实践尝试,以提升页面用户体验。

三、WebP 实践经验

1. 如何判断浏览器支持程度?

WebP 的判断方法在官方文档中进行了总结,大致分为 HTML5 picture、嗅探和Request Header三种方式,下面展开介绍这三种方式。

(1)HTML5 picture

这种方法不进行 WebP 支持程度的判断,而是利用 html5 picture 元素的特性,允许开发者列举出多个图片地址,浏览器根据顺序展示出第一个能够展现的图片元素,如

<picture><source type="image/webp" srcset="images/webp.webp"><img src="images/webp.jpg" alt="webp image">
</picture>复制代码

上面的示例在浏览器不支持 WebP 图片的情况下自动回退到 jpg 格式进行展示,但 picture 的支持程度还不是很完善,开发者可以根据需求决定是否进行使用。

图片

(2)嗅探

嗅探的方式是指直接向浏览器中插入一段 base64 的 WebP 图片,检测图片是否能够正常加载,依据该方法进而判断支持程度,如官方给出的嗅探函数:

// check_webp_feature:
//   'feature' can be one of 'lossy', 'lossless', 'alpha' or 'animation'.
//   'callback(feature, result)' will be passed back the detection result (in an asynchronous way!)
function check_webp_feature(feature, callback) {var kTestImages = {lossy: "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",lossless: "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"};var img = new Image();img.onload = function () {var result = (img.width > 0) && (img.height > 0);callback(feature, result);};img.onerror = function () {callback(feature, false);};img.src = "data:image/webp;base64," + kTestImages[feature];
}复制代码

其中包含了对有损、无损、透明图、动图等 WebP 图片的嗅探,这是一种最为保险的方法。不过缺点也很明显,在图片类型不一且量级较大的情况下,前端并不能知道哪些图片是有损,无损,亦或是透明的,也没有办法对其中一种特定类型做特定策略,所以即使知道不支持该类型的 WebP,然而我们也没有办法主观的去做容错。所以这种方法只适合于图片类型单一的情况,如开发者知道所有图片都是有损的,或是动图等,有针对性的去处理。

同时在处理的过程中,为了提高嗅探效率,嗅探之后可以将结果以本地存储的方式进行保存,如cookie ,方便下次直接进行调用。

(3)Request Header

这种方式是较为符合标准的解决方案,浏览器在支持 WebP 图片格式的情况下,会在请求的 http header accept 中携带 webp/image 的字段,后端接收到请求之后可以按照该形式来判断是否返回 WebP 图片内容。

MIP 在实践中采用的是该方法,当用户访问 MIP Cache 上的页面时,不需要开发者替换图片,MIP Cache 根据 http header 自动决定是否返回 WebP 图片内容。

不过这个过程也依然有坑——国内浏览器层出不群,大部分都向标准化的方向靠近,但仍然需要一定的时间来跟进。所以,在实践过程中我们就发现了这样的问题:虽然 http header accept 中包含了 webp/image 的字段,但实际上是不支持 WebP 格式的(华为 MT7 自带浏览器),具体体现在动图(animation)的 feature 上。而相应的解决方案其实也很简单,就是在 WebP 图片加载失败后发起原图请求,让图片能够正确的展示在页面上,具体方式是通过 img onerror 函数执行对应逻辑。

2. WebP转换工具

WebP 的转换工具很多,主要包含了命令行和可视化界面两种:

(1)命令行

官方对于每一种 WebP 格式也分别提供了对应的转换工具,主要包含了cwebp、dwebp、vwebp、webpmux、gif2webp 等几种,开发者可以择优选择。

(2)可视化

页面也提供了不同可视化的软件进行 WebP 格式图片转换,如:iSparta。

四、总结

WebP 作为一种新型图片格式,不但能够节省流量,减少图片体积,一定程度上也可以优化用户体验。MIP 项目对于 WebP 支持目前已上线,大家可以浏览 MIP 页面进行体验。同时作为关注速度优化的 MIP 团队,我们将不断迭代前行,致力于打造极致的用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chrome 固定缩放比例_您如何调整Google Chrome浏览器的用户界面缩放比例?

chrome 固定缩放比例Everything can be going along nicely until a program gets a new update that suddenly turns everything into a visual mess, like scaling up the UI, for example. Is there a simple solution? Today’s SuperUser Q&A post has some helpful …

树莓派 Raspberry Pi 更换国内源

http://www.shumeipaiba.com/wanpai/jiaocheng/16.html转载于:https://www.cnblogs.com/Baronboy/p/9185849.html

优雅告别 2022 年,2023 年主题:敢想,就敢做!

自从工作之后&#xff0c;每年春节我都会花一天时间&#xff0c;一个人待在一个小房间&#xff0c;思考自己今年做了什么具备阶段性成果的事情。然后&#xff0c;写下明年需要执行的计划。会写在一个 XMind 文件里&#xff0c;记录每一年将要执行的计划&#xff0c;且未完成的计…

纯js上传文件 很好用

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>参数设置</title> <meta name"keywords&q…

买台电脑,不行!去旅游一下,不行!论程序员怎么实现财务自由!

“最近读了一本不是编程的程序员技能书《软技能-代码之外的生存指南》&#xff0c;全书分为 7 个篇章&#xff0c;分别是职业、自我营销、学习、生产力、理财、健身和精神。在读完职业、自我营销和理财这三个篇章后&#xff0c;让我感触很深&#xff0c;也让我很意外。本来以为…

java发送gmail_如何在Gmail中轻松通过电子邮件发送人群

java发送gmailMailing lists are an old tool in the email arsenal, but their implementation in Gmail isn’t immediately intuitive. Read on as we show you how to email groups using your Gmail account. 邮件列表是电子邮件库中的一个旧工具&#xff0c;但是在Gmail中…

移动web开发相关笔记(三)

1.推荐以sublime插件的排名官网:https://packagecontrol.io/&#xff08;sublime插件官网&#xff09;2.时间算法【//总秒数var totalSecond 3671;//获取里面的小时var hoursMath.floor(totalSecond/3600);//获取剩下的分钟var minuteMath.floor(totalSecond%3600/60);//获取剩…

互联网和IT行业越来越严峻,前景几何?

楔子新冠疫情反反复复&#xff0c;互联网和IT行业一路下滑。硅谷裁员高达10万人。前景该何处何从呢&#xff1f;春江水暖猪先知IT行业如此的不景气&#xff0c;自然是一些在风口上被吹起来的猪首先感受到了。他们进行的自救其实就一条:裁员&#xff0c;大量的裁员。裁员可以解决…

Asp.net MVC使用Model Binding解除Session, Cookie等依赖

上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖。其实这个也可以通过Model Binding来达到同样的效果。 什么是Model Binding? Model Binding的作用就是将Request请求中包含的散乱参数&#xff0c;根…

C++回声服务器_4-UDP connect版本客户端

针对UDP套接字调用connect函数不会与对方UDP套接字建立连接&#xff0c;只是向UDP套接字注册目标IP和端口信息。 修改客户端代码 服务器代码不需要修改&#xff0c;只需修改客户端代码。调用connect函数之后&#xff0c;可以调用write函数和read函数来发送、接收数据&#xff0…

如何在路由绑定中使用 IParsable

IParsable 是 .Net 7 中新增的接口&#xff0c;它可以将字符串转换为对应的实体。在 Controller 的 Route 绑定中可以使用 IParsable 来绑定复杂的实体。实验背景 假设有一个需要将 route "report/{month}-{day}" 绑定到 MyDate 对象上的场景。在 .Net 7 之前&#x…

火狐 新增标签 一直加载_在Firefox的新标签页中加载最后标签页的URL

火狐 新增标签 一直加载Yeah, you’re pretty sure that you’re the master of all things Firefox. I mean, why else would you be reading this article? So, we’ve got to ask, have you ever seen this one before? 是的&#xff0c;您很确定自己是Firefox的所有人。 …

ptyhon【递归练习】

转载于:https://www.cnblogs.com/LTEF/p/9187287.html

Iterator 和 for...of 循环

本系列属于阮一峰老师所著的ECMAScript 6 入门学习笔记 Iterator(遍历器) JavaScript表示“集合”的数据结构&#xff0c;除了Array 、Object &#xff0c;ES6又新增了Map 和Set 。 遍历器&#xff08;Iterator&#xff09;是一种统一的接口机制&#xff0c;用来处理所有不同的…

JAVA常量

2019独角兽企业重金招聘Python工程师标准>>> 常量就是一个固定值。它们不需要计算&#xff0c;直接代表相应的值。 常量指不能改变的量。 在Java中用final标志&#xff0c;声明方式和变量类似&#xff1a; final double PI 3.1415927; 虽然常量名也可以用小写&…

基于Docker托管Azure DevOps代理

Azure DevOps非常好用&#xff0c;但是为代理准备单独的服务器经常会显得性价比不高&#xff1a;配置低了&#xff0c;前端构建时会教会你做人&#xff0c;配置太高又有点浪费资源&#xff0c;代理数量少了各团队构建要打架。对于既想享受DevOps的美妙之处但是资源捉襟见肘的小…

微软 word转换pdf_如何将行转换为Microsoft Word表中的列

微软 word转换pdfYou’ve created a table in Word and started to enter your data. Then, you realize that the table should be transposed, meaning the rows should be columns and vice versa. Rather than recreating the table and manually entering the data again,…

pycharm中如何正确配置pyqt5

网上看了几个文章&#xff0c;不成功。这样做才是正确姿势&#xff1a; /Users/mac/anaconda3/bin/Designer.app /Users/mac/anaconda3/bin$ProjectFileDir$ pyuic5 $FileName$ -o $FileNameWithoutExtension$.py $ProjectFileDir$ 其它细节懒得说。 转载于:https://www.cnblog…

JS常用的设计模式

持续更新JS常用的设计模式以及应用场景*以下内容为个人简单理解以及摘抄部分网上demo组成&#xff0c;有错误请在下方评论指出?*# 何谓设计模式没必要被高大上的名词所吓倒&#xff0c;日常coding中或许一个不了解各种设计模式的程序员可能自己其实已经用到了很多抛开官方的定…

如何在Photoshop中制作双曝光图像

Double exposure images are popular at the moment. Taylor Swift’s Style music video and the True Detective opening theme both used the effect. It’s a technique where two separate photos—typically a portrait and a landscape—are blended together into one …