关于Web前端页面的优化——图片篇

看过我近段时间其他博文的朋友会知道:我写的最多的,应该就数“对图片的优化”方面了。

确实,不可否认的是,在页面加载中,最值得前端工程师注意的应该就是图片了吧。。。(个人感觉)
在项目总结与感悟:关于页面性能的优化中最后,我介绍了用 js 实现图片的“隔离优化”;
在项目上线感悟中,我主要介绍了如何用js做图片的“ 预加载 ”以及图片格式的影响。

背景

关于Web前端页面的优化——图片篇_第1张图片
看到这里时,,,我的内心是崩溃的

今天来说一下其他比较实用的方法:

1.js数组与“预加载”

var imgSrcArr=[
   '要预加载的图片路径'(可以多个啊)
];
var imgWrap=[];
function preloadImg(arr) {
    for(var i=0;i

2.图片的“懒加载”

原理: 页面加载后只让文档可视区内的图片显示,其它不显示,随着用户对页面的滚动,判断其区域位置,生成img标签,让到可视区的图片加载出来。
jQuerylazyload插件 便是一个可以实现图片延迟加载的插件,在用户触发某个条件之后再加载对应的图片资源,这对网页的打开速度有很大提升。

引入lazyload.js,对我们想要延迟加载的图片添加lazy样式

HTML中



...
js中: $().ready(function(){ //可任意选择你想延迟加载的目标元素,例如直接使用样式名lazy作为选择条件 $("img .lazy").lazyload({ placeholder : "img/grey.gif", //占位图 effect: "fadeIn", // 加载效果 threshold: 200, // 提前加载 event: 'click', // trigger container: $("#container"), //指定容器 failurelimit : 5 // 发生混乱时的hack手段 }) })

3.用js压缩图片

/**
 * 图片压缩,默认同比例压缩
 * @param {Object} path 
 *   图片路径
 * @param {Object} obj
 *   obj 对象 有 width, height, quality(0-1)   不传width和 height,图片大小不变只改变像素值
 * @param {Object} callback
 *   回调函数有一个参数,base64的字符串数据
*/
function dealImage(path, obj, callback){

        var img = new Image();
        img.src = path;
        img.onload = function(){
            var that = this;
            // 默认按比例压缩
            var w = that.width,
            h = that.height,
            scale = w / h;
            w = obj.width || w;
            h = obj.height || (w / scale);
            var quality = 0.3;  // 默认图片质量为0.7
            //生成canvas
            var canvas = document.createElement('canvas');
            var ctx = canvas.getContext('2d');
            // 创建属性节点
            var anw = document.createAttribute("width");
            anw.nodeValue = w;
            var anh = document.createAttribute("height");
            anh.nodeValue = h;
            canvas.setAttributeNode(anw);
            canvas.setAttributeNode(anh); 
            ctx.drawImage(that, 0, 0, w, h);
            // 图像质量
            if(obj.quality && obj.quality <= 1 && obj.quality > 0){
                quality = obj.quality;
            }
            // quality值越小,所绘制出的图像越模糊
            var base64 = canvas.toDataURL('image/jpeg', quality );
            // 回调函数返回base64的值
            callback(base64);
        }
    }       


4.后台java实现压缩

这个是我从 简书 上某博主哪里看来的,感觉不错,在这里分享一下:
原理: 利用Java原生的imageIO类进行裁剪

/**
     * 缩放图像(按比例缩放)
     *
     * @param src    源图像
     * @param output 输出流
     * @param scale  缩放比例
     * @param flag   缩放选择:true 放大; false 缩小;
     */
    public static final void zoomScale(BufferedImage src, OutputStream output, String type, double scale, boolean flag) {
        try {
            // 得到源图宽
            int width = src.getWidth();
            // 得到源图长
            int height = src.getHeight();
            if (flag) {
                // 放大
                width = Long.valueOf(Math.round(width * scale)).intValue();
                height = Long.valueOf(Math.round(height * scale)).intValue();
            } else {
                // 缩小
                width = Long.valueOf(Math.round(width / scale)).intValue();
                height = Long.valueOf(Math.round(height / scale)).intValue();
            }
            Image image = src.getScaledInstance(width, height, Image.SCALE_DEFAULT);
            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            // 绘制缩小后的图
            g.drawImage(image, 0, 0, null);
            g.dispose();
            // 输出为文件
            ImageIO.write(tag, type, output);
        } catch (IOException e) {
            throw new KitException(e);
        }
    }

你可能感兴趣的:(前端时间,js基础与进阶)