二维码生成图片 canvas.toDataURL()降低图片质量,以减少图片上传大小

本文介绍了如何使用canvas和jQuery来降低jpg/jpeg格式二维码图片的质量,从而减少图片上传的大小。通过设置不同的encoderOptions值,可以在保持可接受的视觉效果的同时,将图片大小控制在特定范围。不过,这种方法不适用于png和gif格式的图片,因为它们的大小可能会增加。代码示例展示了如何处理本地图片,并提供了调整图片质量的选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 目前只针对jpg/jpeg格式少部分测试,图片最终是以降低图片质量来限制图片大小,与原图差异较大,如果图片本身是以固定宽高(约150px * 150px)展示时,看不出来差异。
  2. canvas针对png、gif图片的质量降低,处理后图片大小反而增加。不适用于png、gif格式图片
  3. canvas转换成url前,需要已加载一张图片(称为原图),因此前后将保留两张图片的加载(了解)
  4. 代码仅处理了本地图片jpg转换(使用new FileReader()创建本地图片路径并以此加载原图),如果需要处理远程图片,则不需要借助new FileReader()来创建本地图片url,但需要为原图增加属性crossOrigin并赋值Anonymous字符串,且原图在页面中加载,才能使用canvas做图片大小转换
  5. 从控制台输出来看,应该在是图片大小的2.7倍左右。

<input type="file" name="" id="file"> <img src="" alt="" id="preimg" style="width: 150px; height: 150px;"/> <img src="" alt="" id="img" style="width: 150px; height: 150px;"/>

// 测试后定义降低图片质量的encoderOptions值
// 转换后的大小不能保证准确,尽量在800KB以下了
var formatOptionForJPG = [{
    encoderOptions: 0.0625,
    // 7.85M -> 532KB
    maxSize: 8236315
    }, {
    encoderOptions: 0.125,
    // 6.36M -> 552KB
    maxSize: 6674942
    }, {
    encoderOptions: 0.25,
    // 5.09M -> 621KB
    maxSize: 5340449
    }, {
    encoderOptions: 0.5,
    // 3.20M -> 536KB
    maxSize: 3361652
    }, {
    encoderOptions: 0.92,
    // 1.21M -> 519KB
    maxSize: 1270719
    }, {
    encoderOptions: 0.99,
    // 605KB -> 547KB
    maxSize: 620450,
    }, {
    encoderOptions: 1,
    // 219KB -> 519KB
    maxSize: 225061
}];
// 获取encoderOptions
function getEncoderOptionsVal(size, option) {
    var result;
    option.reverse().some(e => {
        result = e.encoderOptions;
        return size <= e.maxSize;
    });
    return result;
}
// 优化图片
function formatPic(doc, optionVal) {
    var imgEle = document.getElementById('img');
    var preimgEle = document.getElementById('preimg');
    let file = new FileReader();
    file.readAsDataURL(doc);
    file.onload = () => {
        let url = file.result;
        preimgEle.src = url;
        let ext = url.split(';')[0].replace('data:image/', '');
        if (ext === 'jpg' || ext === 'jpeg') {
            let img = new Image();
            img.src = url;
            img.onload = () => {
                var canvas = document.createElement('canvas');
                canvas.width = img.width;
                canvas.height = img.height;
                var ctx = canvas.getContext('2d');
                ctx.drawImage(img, 0, 0, img.width, img.height);
                url = canvas.toDataURL('image/' + ext, optionVal);
                imgEle.src = url;
                console.log('url', url);
            }
        } else if (ext === 'png') {
            imgEle.src = url;
            console.log('url', url);
        }
    }
}
// 就绪事件
document.addEventListener('DOMContentLoaded', function () {
    var inpEle = document.getElementById('file');
    inpEle.addEventListener('change', function () {
        var doc = this.files[0];
        var option = [].concat(formatOptionForJPG);
        if (doc.size > option[0].maxSize) {
            alert('图片太大的处理');
        } else {
            var optionVal = getEncoderOptionsVal(doc.size, option);
            formatPic(doc, optionVal);
        }
        this.value = '';
    });
});
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值