使用场景:后端无需做图片大小验证,前端直接进行图片压缩,传给后端base64格式的图片地址。话不多说直接上代码:
cavans图片压缩 - 锐客网
>
// 文件规则
const ACCEPT = ['image/jpg', 'image/png', 'image/jpeg'];
const MAXSIZE = 6 * 1024 * 1024;
const MAXSIZE_STR = '1MB';
const upload = document.querySelector('#upload');
// 监听文件上传事件并传值
upload.addEventListener('change', (e) => {
console.log(e.target.files);
const [file] = e.target.files;
if (!file) {
return;
}
const { type: fileType, size: fileSize } = file;
// 图片类型检查
if (!ACCEPT.includes(fileType)) {
alert(`暂时不支持${fileType}文件类型`);
upload.valuehttps://www.it610.com/article/= '';
return;
}
// 图片大小检查
if (fileSize > MAXSIZE) {
alert(`该文件超出${MAXSIZE_STR}`);
upload.valuehttps://www.it610.com/article/= '';
return;
}
converImageToBase64(file, (base64Image) =>
compress(base64Image, uploadToServer)
);
});
// 原图转为base64
function converImageToBase64(file, callback) {
let reader = new FileReader();
reader.readAsDataURL(file);
reader.addEventListener('load', function (e) {
const base64Image = e.target.result;
// console.log('原图base64', base64Image);
// 将nase64文件传入压缩方法中
callback && callback(base64Image);
});
}
// 图片压缩主要代码
function compress(base64Image, callback) {
let maxW = 1024;
let maxH = 1024;
const image = new Image();
image.src = https://www.it610.com/article/base64Image;
// document.body.appendChild(image);
// 监听图片加载事件
image.addEventListener('load', function (e) {
let ratio;
// 图片压缩比
let needCompress = false;
// 图片是否需要压缩
if (maxW < image.naturalWidth) {
needCompress = true;
ratio = image.naturalWidth / maxW;
maxH = image.naturalHeight / ratio;
}
if (!needCompress) {
ratio = image.naturalHeight / maxH;
maxW = image.naturalHeight / ratio;
}
const canvas = document.createElement('canvas');
canvas.setAttribute('id', '__compress__');
canvas.width = maxW;
canvas.height = maxH;
canvas.style.visibility = 'hidden';
document.body.appendChild(canvas);
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, maxW, maxH);
ctx.drawImage(image, 0, 0, maxW, maxH);
const compressImage = canvas.toDataURL('image/jpeg', 0.8);
// 值越大压缩后的图片越小,但是太小图片会失真
callback && callback(compressImage);
// 显示压缩后的图片
const _image = new Image();
_image.src = https://www.it610.com/article/compressImage;
document.body.appendChild(_image);
// 预览压缩后的图片
canvas.remove();
// console.log('压缩比', image.src.length / _image.src.length);
});
}
// 压缩后的base64上传到服务器
function uploadToServer(compressImage) {
console.log('uploadToServer......', compressImage);
if (compressImage) {
alert('图片压缩成功');
}
}
推荐阅读
- Winamp2-js(在HTML5和Javascript中对Winamp 2.9的重新实现)
- 如何在Windows中使用Electron框架为桌面(html,css和javascript)创建混合应用程序
- GD(无需编码技能的开源HTML5和本机游戏创建者)
- Matreshka.js(创建单页应用程序的简单JavaScript框架)
- Prepack(用于JavaScript的部分评估程序,可生成有效的JavaScript)
- JavaScript|JavaScript 之常用字符串方法及使用技巧
- vxe-table|【vxe-table】和【el-table】调整列(单元格)背景色,指定列背景色设置,两层或多层表头也适用
- linq|中石化、中石油接口文档源码分享
- Node百科|06.V8 JavaScript 引擎