前段时间准备换工作,去面试,被问到有没有自己实现过图片压缩,很尴尬,确实没有。于是,刚好有时间,就自己简单记录一下
html:
<input type="file" accept="image/*" @change="changeFile($event)" />
js:
changeFile(e) { const img = new Image(); const reader = new FileReader(); let file = e.target.files[0]; //缩放图片需要的canvas let canvas = document.createElement('canvas'); let context = canvas.getContext('2d'); //判断选择的图片是否图片 if (e.type.indexOf('image') == 0) { reader.readAsDataURL(file); } //文件base64化,以便获知图片原始尺寸 reader.onload = function(even) { img.src = even.target.result; }; //base64地址图片加载完毕后 img.onload = function() { //图片原始尺寸 let originWidth = this.width; let originHeight = this.height; console.log(originWidth, originHeight); //最大尺寸限制 let maxWidth = 400; let maxHeight = 400; //目标尺寸 let targetWidth = originWidth; let targetHeight = originHeight; //图片尺寸超过400*400的限制 if (originWidth > maxWidth || originHeight > maxHeight) { if (originWidth / originHeight > maxWidth / maxHeight) { //更宽,按照宽度限定尺寸 targetWidth = maxWidth; targetHeight = Math.round(maxWidth * (originHeight / originWidth)); } else { targetHeight = maxHeight; targetWidth = Math.round(maxHeight * (originWidth / originHeight)); } } //canvas对图片进行缩放 canvas.width = targetWidth; canvas.height = targetHeight; //清除画布 context.clearRect(0, 0, targetWidth, targetHeight); //图片压缩 context.drawImage(img, 0, 0, targetWidth, targetHeight); //canvas转为blob并上传 canvas.toBlob(function(blob) { //图片ajax上传 const formData = new FormData(); formData.append('file', blob); //调用上传图片接口 //axios.post('http://xxx.com/api',formData); //清除内容 //e.target.value = ''; }, file.type || 'image/png'); }; },
还有很多可以优化的地方,比如
1、将文件file转换成img可以提取个方法
2、图片压缩可以提取个方法,然后限制大小用传参的方式
等等。。。