JS实现PC与移动端通用的图片压缩方案
作者:像素漫游时间:2026-10-21 20:10:14浏览:610
本文介绍一种基于HTML5 Canvas技术的JavaScript图片压缩方法,适用于PC端和移动端。通过获取图片数据并转换为Base64字符串,可有效减小文件体积,节省服务器带宽与用户流量。文中提供了完整的函数实现及调用示例,详细说明了参数配置与路径处理注意事项,帮助开发者快速集成图片压缩功能。
移动端图片压缩背景与需求
在移动端开发过程中,常会遇到手机拍摄照片体积过大的问题。若直接将这些大图片上传至服务器,不仅会消耗大量服务器带宽,更会严重占用用户的移动数据流量。针对这一痛点,业界已有多种图片压缩方案可供研究与应用。
结合前人的经验与实战案例,这里总结出一套可行的处理方法,供开发者参考使用。
图片压缩核心函数实现
/**
* 图片压缩,默认同比例压缩
* @param {Object} path
* pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径
* @param {Object} obj
* obj 对象 有 width, height, quality(0-1)
* @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.7; // 默认图片质量为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);
}
}
该方案最终返回的结果为一个Base64编码的字符串。
开发者可以自行测试压缩后图片的具体大小,以验证压缩效果。
函数调用与测试示例
// 调用函数处理图片
dealImage("路径", {
// 注意:在pc端可以用绝对路径或相对路径,移动端最好用绝对路径(因为用take photo后的图片路径,我没有试成功(如果有人试成功了可以分享一下经验))
width : 200
}, function(base){
//直接将获取到的base64的字符串,放到一个image标签中就可看到测试后的压缩之后的样式图了
document.getElementById("transform").src = base;
console.log("压缩后:" + base.length / 1024 + " " + base);
})
技术原理与后端处理流程
核心原理在于获取原始图片数据,利用HTML5 Canvas技术将其转换为Base64格式的字符串,随后将该字符串传输至后台服务器,由后端负责将Base64数据还原为图像文件进行存储。
以上即为本文介绍的全部内容,期望这些内容能对各位的学习或工作有所帮助,同时也感谢大家的支持。
作者最新文章
D3.js 处理大规模数据点的性能优化策略
2026-11-05 15:37:25
JS实现网页摄像头实时扫码:结合getUserMedia与jsQR教程
2026-11-05 15:27:28
D3.js v5 迁移到 v7 的 API 变更与注意事项
2026-11-05 11:57:17
使用 animate.js 实现多元素协同的序列动画
2026-11-04 22:27:53
JS拖拽排序时怎么添加平滑动画效果?FLIP技术实战
2026-11-04 10:12:22
