HTML5 canvas 上传图片时压缩
原理与要点
- canvas
- FileReader
- Image
- 通过读取 input file 上的文件对象,将对象使用 fileReader 读成 base64 格式
- 将上面读下来的 base64 格式的数据,挂载到一个 Image 对象上
- 绘制一下固定大小的 canvas (要压缩的大小),根据上面的 image 对象进行宽、高比例的获取
- 将宽、高、image 对象都绘制到 canvas 上
- 读取 canvas 对象的 blob 数据,将数据上传
参考
代码实现
<input id="file" type="file">
var eleFile = document.getElementById('file')
var reader = new FileReader()
var img = new Image();
var file = null;
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
function getWidthAndHeight(image) {
var originWidth = image.width;
var originHeight = image.height;
var maxWidth = 400, maxHeight = 400;
var targetWidth = originWidth, targetHeight = originHeight;
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));
}
}
return {w: targetWidth, h: targetHeight}
}
img.onload = function () {
var wh = getWidthAndHeight(img)
canvas.width = wh.w;
canvas.height = wh.h;
context.clearRect(0, 0, targetWidth, targetHeight);
context.drawImage(img, 0, 0, targetWidth, targetHeight);
canvas.toBlob(function (blob) {
}, file.type || 'image/png');
};
reader.onload = function(e) {
img.src = e.target.result;
};
eleFile.addEventListener('change', function (event) {
file = event.target.files[0];
if (file.type.indexOf("image") === 0) {
reader.readAsDataURL(file);
}
});