1、新建一个canvas
画布,将宽高设置为需要压缩到的尺寸;
该画布既为图片缩放后的尺寸,此处有个点是需要保证图片的比例不变, 因此需要通过计算得出画布的宽与高:
let imgRatio = img.naturalWidth / img.naturalHeight; // 创建一个画布容器; let cvs = document.createElement('canvas'); // 获取容器中的画板; let ctx = cvs.getContext('2d'); cvs.width = 1000; cvs.height = cvs.width / imgRatio;
2、将图片画入后再导出成base64
;
这里使用2个最常用的方法:
ctx.drawImage(image, dx, dy, dw, dh)
: 这个方法其实最多可以接收9个参数, 实现压缩,只需要使用其中的5个参数即可, 其余参数在其它部分使用到时再做详解;
image : 需要绘制的图片源,需要接收已经 加载完成 的HTMLImageElement
,HTMLCanvasElement
或者HTMLVideoElement
; dx / dy : 相对于画布左上角的绘制起始点坐标; dw / dh : 绘制的宽度和高度,宽高比例并不锁定,可使图片变形;
cvs.toDataURL(type, quality)
: 该方法用于将画布上的内容导出成 base64
格式的图片,可配置2个参数;
type: 图片格式, 一般可以使用 image/png
或者 image/jpeg
, 当图片不包含透明时,建议使用jpeg
,可使导出的图片大小减小很多; quality: 图片质量,可使用0~1
之间的任意值;经过测试,该值设置成0.9
时较为合适,可以有效减小图片文件大小且基本不影响图片清晰度,导出后的 base64
既为压缩后的图片;
Tips: 此处有个坑, 想导出jpg
格式的图片必须用image/jpeg
,不能使用image/jpg
;
// 将原图等比例绘制到缩放后的画布上; ctx.drawImage(image, 0, 0, cvs.width, cvs.height); // 将绘制后的图导出成 base64 的格式; let b64 = cvs.toDataURL('image/jpeg', 0.9);
3.多种格式的图片转换成base64
;
我们常用的图片上传功能,我们使用的是原生的<input type="file">
标签,此时获取到的是File
格式的图片,图片的格式各异且尺寸很大,我们应该压缩处理后再使用。
使用FileReader
:
let file = e.files[0]; if(window.FileReader) { let fr = new FileReader(); fr.onloadend = e => { let b64 = e.target.result; // b64即为base64格式的用户上传图; }; fr.readAsDataURL(file); }
对base64
的图片使用刚才的canvas
方式进行压缩的处理;
Tips: 这里有个小坑是,图片的EXIF
信息中的方向值会影响图片的展示,在