资讯专栏INFORMATION COLUMN

移动端webP调研

airborne007 / 3230人阅读

摘要:移动端调研介绍格式,谷歌开发的一种旨在加快图片加载速度的图片格式。图像的解码及显示都在中完成,因此目前版本对设置的背景图片无效。业界分析天猫前端方案美团后端判断返回大图采用了像列表页详情页的图片预览参考资料图片的高效使用

移动端webP调研 webP介绍

WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。支持有损压缩和无损压缩,无损压缩后比png文件少了大约35%,有损压缩后比png文件少了大约70%,能节省大量的服务器带宽资源和数据空间。

webP如何转换

1、 智图http://zhitu.isux.us/
2、 iSparta
3、 libwebp
4、http://image.online-convert.com/convert-...
5、Cloudinary
6、谷歌开发的命令行

兼容性测试
机型 浏览器 支持情况
Ios 4s/5/5s/6/6s uc 支持
Ios 4s/5/5s/6/6s safari 不支持
Ios 4s/5/5s/6/6s chrome 不支持
Ios 4s/5/5s/6/6s QQ浏览器 不支持
Ios 4s/5/5s/6/6s 手机百度 不支持
Ios 4s/5/5s/6/6s Opera 支持
Ios 4s/5/5s/6/6s 微信 不支持
Android 三星/小米3 本地浏览器Android 4.0 + 支持
Android 三星/小米3 chrome 支持
Android 三星/小米3 uc 支持
Android 三星/小米3 QQ浏览器v6.4.1+ 支持
Android 三星/小米3 手机百度7.1+ 支持
Android 三星/小米3 微信 支持
兼容解决方案

前端JS方案(推荐)——利用img标签加载一张base64的WebP图片,在img标签的onload事件中判断该图片是否具有宽高的属性,若有表示支持webP,若没有表示不支持webP。

testWebp = function(callback){

       var image = new Image();  
       image.onerror = function() {  
         callback(false);  
       };  
       image.onload = function() {  
         callback(image.width == 1);  
       };  
       image.src = "data:image/webp;base64,UklGRiwAAABXRUJQVlA4ICAAAAAUAgCdASoBAAEAL/3+/3+CAB/AAAFzrNsAAP5QAAAAAA==";  

};

webSrc = function(src){

       var suffix = src.lastIndexOf(".");  
       suffix = src.substr(suffix);  
       if (/png|jpg/.test(suffix)){  
           return src.substr(0,(src.length-3))+"webp";  
       }else{  
           return src;  
       }  

};
$(function(){
testWebp(

   function(SUP){
       var $img = $("img[data-img]");
       if(SUP){
           $("body").addClass("webp");
           $img.each(function(i,o){
               var src= $(o).attr("data-img");
               $(o).attr("src",webSrc(src));
           });
       }
       else{
           $("body").addClass("nowebp");
           $img.each(function(i,o){
               var src= $(o).attr("data-img");
               $(o).attr("src",src);
           });
       }
   }

)
})

- 后台判断方案——判断浏览器请求头Accept是否支持WebP,返回是否支持的标示给前台。
- iOS独立版

这样做的好处在于下载WebP的时候节省了带宽,虽然在转码的时候会耗时,但是由于下载时间缩短中和了转码的时间,所以用户基本感觉不出来差别。我们在不延长用户等待时间的同时缩小图片体积,节省了带宽。

安卓独立版
后台判断用户机器系统,当系统版本大于4.0的时候返回支持WebP标示(因为其原生支持),前端拉取图片时后台会根据这个标示决定使用原格式图片还是WebP格式的图片。

webp.js
插件将会捕捉页面中使用WebP格式的img元素,并用Flash进行替换。图像的解码及显示都在Flash中完成,因此目前版本对CSS设置的背景图片无效。

当然,作为JPEG格式的替换,只有对较大的图像使用才有意义,否则过多的解码将消耗大量的资源。

业界分析

天猫 (前端JS方案)
https://www.tmall.com/?locate=icon-1&spm...

define("mui/tangram/webp", function(e, t, i) {
    "use strict";
    var r = false;
    var n = false;
    var a = false;
    var u = [];
    var m = "";
    var o = 0;
    var s = 7;
    var d = window.g_config || {};
    i.exports = {
        init: function p() {
            var e = this;
            e._testJPG();
            e._testPNG();
            e._testAlpha()
        },
        _loadDone: function l(e, t) {
            o |= e;
            this._checkDone(t)
        },
        _testJPG: function g(e) {
            var t = this;
            var i = new Image;
            i.onload = function() {
                r = true;
                u.push("jpg");
                u.push("jpeg");
                t._loadDone(1, e)
            }
            ;
            i.onerror = function() {
                t._loadDone(1, e)
            }
            ;
            i.src = "data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA"
        },
        _testPNG: function c(e) {
            var t = this;
            var i = new Image;
            i.onload = function() {
                n = true;
                u.push("png");
                t._loadDone(2, e)
            }
            ;
            i.onerror = function() {
                t._loadDone(2, e)
            }
            ;
            i.src = "data:image/webp;base64,UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA=="
        },
        _testAlpha: function f(e) {
            var t = this;
            var i = new Image;
            i.onload = function() {
                a = true;
                t._loadDone(4, e)
            }
            ;
            i.onerror = function() {
                t._loadDone(4, e)
            }
            ;
            i.src = "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA=="
        },
        _checkDone: function x(e) {
            var t = this;
            if (o === s) {
                if (t["canAddSuffixReg"] === undefined) {
                    t._generateReg()
                }
                if (e && e.__webp__hadExec === undefined) {
                    e.__webp__hadExec = true;
                    S.isFunction(e) && e({
                        jpeg: r,
                        jpg: r,
                        png: n,
                        alpha: a
                    })
                }
            } else {
                return false
            }
        },
        _generateReg: function y() {
            m = u.join("|");
            if (u.length > 0) {
                this["canAddSuffixReg"] = new RegExp(m + "$","i");
                this["transformReg"] = new RegExp("(." + m + ")s*"","gi")
            }
        },
        isSupport: function A(e) {
            var t = this;
            if (t._checkDone(e) === false) {
                t._testJPG(e);
                t._testPNG(e);
                t._testAlpha(e)
            }
            return {
                jpeg: r,
                jpg: r,
                png: n,
                alpha: a
            }
        },
        get: function v(e, t) {
            var i = this;
            if (o === s) {
                if (i.canAddSuffixReg && i.canAddSuffixReg.test(e)) {
                    if (n || n === false && e.indexOf(".png") < 0) {
                        return e + (t ? t : "_.webp")
                    }
                }
            }
            return e
        },
        transform: function h(e, t) {
            if (o === s) {
                if (this.transformReg !== undefined) {
                    e = e.replace(this.transformReg, "$1" + (t ? t : "_.webp") + """);
                    if (n === false) {
                        e = e.replace(new RegExp("(.png_.+?.(?:jpg|jpeg))" + (t ? t : "_.webp"),"gi"), "$1")
                    }
                }
            }
            return e
        },
        suffix: function b(e, t) {
            var i = this;
            if (o === s) {
                if (i.canAddSuffixReg && i.canAddSuffixReg.test(e)) {
                    if (n || n === false && e.indexOf(".png") < 0) {
                        return t ? t : "_.webp"
                    }
                }
            }
            return ""
        }
    }
});

美团(后端判断返回)
大图采用了webP,像列表页banner,详情页的图片预览

参考资料

https://developers.google.com/speed/webp...
http://news.oneapm.com/bi-webp-2/
http://zhitu.isux.us/index.php/preview/w...
WebP 图片的高效使用 http://www.etherdream.com/WebP/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/59909.html

相关文章

  • PWA 时代的移动图片优化新思路

    摘要:是一个注册在指定源和路径下的事件驱动。移动端方面的支持度较好,从版本开始支持。作为提出的一项技术,在端有很好的支持,但目前的兼容性还无法在移动端网页中广泛使用。从而达到向后兼容式的优化。 图片通常是移动端网页中最占流量的资源。在很多类型的网站中(比如电商、社区),图片占据了网页的大部分空间。优化图片的质量和加载速度成为提高用户体验的重要途径。 传统方案的弊端 目前有一些被广泛应用的方案...

    RaoMeng 评论0 收藏0
  • PWA 时代的移动图片优化新思路

    摘要:是一个注册在指定源和路径下的事件驱动。移动端方面的支持度较好,从版本开始支持。作为提出的一项技术,在端有很好的支持,但目前的兼容性还无法在移动端网页中广泛使用。从而达到向后兼容式的优化。 图片通常是移动端网页中最占流量的资源。在很多类型的网站中(比如电商、社区),图片占据了网页的大部分空间。优化图片的质量和加载速度成为提高用户体验的重要途径。 传统方案的弊端 目前有一些被广泛应用的方案...

    zhaofeihao 评论0 收藏0
  • 移动本地 H5 秒开方案探索与实现

    摘要:然而这样的方案实现起来十分繁琐,原因是资源给到客户端打包时很分散,不统一,管理困难。上述讨论的仅针对功能模块类的单页面页面秒开的优化方案,其他一些交互较复杂的页面可能并不适用,还需要视实际情况和需求而定。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 企业微信移动端项目中有需求要展示数据趋势的可视化图表,经过调研,最终决定以单页面 H5 来完成,对 APP 里的一些使用 ...

    snowell 评论0 收藏0
  • 【译】 WebP 支持:超出你想象

    摘要:的支持程度实际上比你想的可能要好得多。的安卓浏览器从版本起开始官方支持最初发布于年月,版本起开始部分支持。安卓版从起开始支持。而且目前并无添加支持的任何打算。浏览器市场份额截至年月的数据显示,占有约的市场份额,以约位居第二。 本文转载自:众成翻译译者:文蔺链接:http://www.zcfy.cc/article/862原文:https://optimus.keycdn.com/sup...

    Steven 评论0 收藏0
  • fir.im Weekly - 30 天从 0 开始学 Swift

    摘要:本文总结了微信在适配上遇到的问题和解决方案。由微信移动客户端开发团队官方账号发出,全文阅读看这里被误解的和被神化的唐巧大神在这篇文章里讲述了正确掌握使用的姿势,深入剖析了和,中间提到了开发中的一些最佳实践。 最近一周看到很多很好用的的轮子,忍不住推荐给大家。此外,本期 fir.im Weekly 还精选了一些实用的 iOS , Android , UI 动画的干货文章。让我们一起来看下...

    econi 评论0 收藏0

发表评论

0条评论

airborne007

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<