JS压缩图片(canvas),返回base64码

上传图片时总会遇到图片过大上传不上去的问题,本方法是在网上搜的压缩图片的例子,我测试过了,确实能用,但是照搬别人的代码,发现压缩后图片会失真,不清晰,现经修改图片清晰度还可以,不仔细看差别不大,so,改了改

JS   返回的是一个base64字符串

/** 
 * 图片压缩,默认同比例压缩 
 * @param {Object} path     
 *         pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径 
 * @param {Object} obj 
 *         obj 对象 有 width, height, quality(0-1) 
 * @param {Object} callback 
 *         回调函数有一个参数,base64的字符串数据 
 */  
function dealImage(path, callback){  
    var img = new Image();  
    img.src = path;  
    img.onload = function(){  
        //默认按比例压缩  
        var w = this.width,  
            h = this.height; 
        var quality = 0.95; // 默认图片质量为0.7  
          
        //生成canvas  
        var canvas = document.createElement('canvas');  
        var ctx = canvas.getContext('2d');  
          
        // 创建属性节点  
        canvas.setAttribute("width", w);  
        canvas.setAttribute("height", h);
                
        ctx.drawImage(this, 0, 0, w, h);  
        // quality值越小,所绘制出的图像越模糊  
        var base64 = canvas.toDataURL('image/jpeg', quality);  
        // 回调函数返回base64的值  
        callback(base64);  
    };  
};

调用方法

// 调用函数处理图片                 
dealImage("路径",function(base){
//直接将获取到的base64的字符串,放到一个image标签中就可看到测试后的压缩之后的样式图了
 document.getElementById("transform").src = base;
 console.log("压缩后:" + base.length / 1024 + " " + base);    
})

压缩前图片:326KB


压缩后图片:196KB


参考代码:点击打开链接

可以使用 JavaScript 的 FileReader 和 Canvas API 实现图片压缩并转换为 base64。 首先,使用 FileReader 将图片读取为 Blob 对象,然后使用 Canvas API 将图片压缩为指定的宽度和高度,最后将压缩后的图片转换为 base64。 以下是一个示例代: ``` function compressAndConvertToBase64(file, maxWidth, maxHeight, callback) { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function(event) { const img = new Image(); img.src = event.target.result; img.onload = function() { const canvas = document.createElement('canvas'); let width = img.width; let height = img.height; if (width > height) { if (width > maxWidth) { height *= maxWidth / width; width = maxWidth; } } else { if (height > maxHeight) { width *= maxHeight / height; height = maxHeight; } } canvas.width = width; canvas.height = height; const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0, width, height); const compressedBase64 = canvas.toDataURL('image/jpeg', 0.7); callback(compressedBase64); } } } ``` 其中,参数 `file` 是要压缩图片文件,`maxWidth` 和 `maxHeight` 分别是压缩后的图片最大宽度和高度,`callback` 是压缩完成后的回调函数。压缩后的图片质量可以通过 `toDataURL` 方法的第二个参数来控制,值越小表示压缩后的图片质量越低。 使用示例: ``` const fileInput = document.querySelector('#file-input'); fileInput.addEventListener('change', function() { const file = fileInput.files[0]; compressAndConvertToBase64(file, 800, 600, function(base64) { console.log(base64); }); }); ``` 以上代可以将选择的文件压缩为最大宽度为 800、最大高度为 600 的图片,并将压缩后的图片转换为 base64输出到控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值