本文介绍如何利用JavaScript和Canvas API实现前端图片的预览、压缩与上传功能。通过FileReader读取文件,Canvas绘制并调整质量参数进行压缩,最后生成Base64数据供上传。文中对比了不同压缩比的效果,并指出Base64编码对文件大小的影响及IE9以下版本的兼容性问题。
JS与Canvas实现图片预览、压缩及上传
首先展示最终实现的效果。

第一步:用户选择需要上传的图片
<input type="file" accept="image/*" type="file"" name="imageFile" onchange="upload()">
当用户选定图片后,将触发 upload 函数。我们需要在该函数中获取图片资源,利用 Canvas 进行绘制与压缩处理。若需上传至服务器,可结合 AJAX 或其他网络请求方式完成传输。
第二步:获取图片资源压缩预览上传
function upload() {
let file = document.querySelector('input[type=file]').files[0] // 获取选择的文件,这里是图片类型
let reader = new FileReader()
reader.readAsDataURL(file) //读取文件并将文件以URL的形式保存在resulr属性中 base64格式
reader.onload = function(e) { // 文件读取完成时触发
let result = e.target.result // base64格式图片地址
var image = new Image() image.src = result // 设置image的地址为base64的地址
image.onload = function(){
var canvas = document.querySelector("#canvas");
var context = canvas.getContext("2d");
canvas.width = image.width; // 设置canvas的画布宽度为图片宽度
canvas.height = image.height;
context.drawImage(image, 0, 0, image.width, image.height) // 在canvas上绘制图片
let dataUrl = canvas.toDataURL('image/jpeg', 0.92) // 0.92为压缩比,可根据需要设置,设置过小会影响图片质量
// dataUrl 为压缩后的图片资源,可将其上传到服务器
}
}
}
接下来对比图片压缩前后的效果,以验证压缩是否成功:
原图大小:
压缩比设置为0.92:

压缩比设置为0.52

观察结果可能令人疑惑:为何设置缩放比为0.92时,图片体积反而比原图大?这是因为图片经过 Base64 编码后体积通常会增加,具体原因可查阅 Base64 编码原理。尽管如此,从视觉和数据处理角度看,我们已实现了图片压缩的目标。
注意事项:Canvas 在 IE9 以下版本中不支持;对于大尺寸图片,尽量避免使用 Base64 格式,以免影响响应速度。
总结
以上介绍了基于 JS 和 Canvas 实现图片预览、压缩及上传的功能,希望能为读者提供帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!