js压缩图片

 有两个需要注意的点:

 

var base64 = canvas.toDataURL('image/jpeg', quality);

1、其中在输出图片base64时,可选的格式除了jpeg外还有png,webp等,从图片质量的角度看推荐使用webp,但webp在没有img标签时不能直接通过浏览器打开。

2、通过canvas输出base64格式的图片不能直接通过表单上传到服务器,还需要多做一步转化成Blob.

 

下面是完整的代码

 

HTML代码

<div class="upload">
    <div id="uploaded" class="uploaded">
        <!-- <img id="imgPreview" src="images/avatar.png" alt=""> -->
        <a href="javascript:;"><input id="files" type="file" onchange="readFile(this)" accept="image/*"/></a>
    </div>
    <p>上传照片,请注意隐藏图片中的隐私信息</p>
</div>

JS代码

var imgUrl = [];
    var imgId = 0;

    function readFile(obj) {
        // show loading
        var html = '<span class="img loading" ><img  src="/images/app/loading.gif" alt=""></span>';
        $("#uploaded").append(html);
        imgloading = true;

        var file = obj.files[0];
        //判断类型是不是图片
        if (!/image\/\w+/.test(file.type)) {
            alert("请确保文件为图像类型");
            return false;
        }
        var reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function (e) {
            dealImage(this.result, {width: 200}, function (base) {
                var blob = convertBase64UrlToBlob(base);
                var formData = new FormData();
                formData.append('files', blob);
                $.ajax({
                    type: "POST",
                    url: "/complaint/saveImg",
                    data: formData,
                    contentType: false,
                    processData: false,
                    dataType: 'json',
                    success: function (data) {
                        if (data.status == 1) {
                            imgUrl.push(data.imgUrl);
                            imgId += 1;
                            var html = '<span class="img" id="' + imgId + '"><a class="del" onClick=\"delImg(\'' + data.imgUrl + '\',' + imgId + ');\"></a><img  src="' + base + '" alt=""></span>';
                            try {
                                $("#uploaded").find('.loading').eq(0).remove();
                            } catch (e) {
                            }

                            $("#uploaded").append(html);
                        } else {
                            alert('上传失败')
                            try {
                                $("#uploaded").find('.loading').eq(0).remove();
                            } catch (e) {
                            }

                        }
                        imgloading = false;
                        return;
                    },error:function () {
                        alert('上传失败');
                        try {
                            $("#uploaded").find('.loading').eq(0).remove();
                        } catch (e) {
                        }

                        imgloading = false;
                    }
                });
            });
        }
    }

    /**
     * 图片压缩,默认同比例压缩
     * @param {Object} path
     * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径
     * @param {Object} obj
     * obj 对象 有 width, height, quality(0-1)
     * @param {Object} callback
     * 回调函数有一个参数,base64的字符串数据
     */
    function dealImage(path, obj, callback) {
        if (path.length <= 640 * 1024) {
            callback(path);
            return;
        }
        var img = new Image();
        img.src = path;
        img.onload = function () {
            var that = this;
            // 默认按比例压缩
            var w = that.width,
                h = that.height;
            var quality = 0.8; // 默认图片质量为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);

            //计算压缩质量比
            quality = (640 * 1024) / path.length;

            // quality值越小,所绘制出的图像越模糊
            var base64 = canvas.toDataURL('image/jpeg', quality);
            // 回调函数返回base64的值
            callback(base64);
        }
    }

    /**
     * 将以base64的图片url数据转换为Blob
     * @param urlData
     * 用url方式表示的base64图片数据
     */
    function convertBase64UrlToBlob(urlData) {
        var arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],
            bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
        while (n--) {
            u8arr[n] = bstr.charCodeAt(n);
        }
        return new Blob([u8arr], {type: mime});
    }

    //删除图片
    function delImg(picUrl, imgId) {
        var index = imgUrl.indexOf(picUrl);
        if (index >= 0) {
            imgUrl.splice(index, 1);
            $("#" + imgId).remove();
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值