之前使用 exif-js 获取图片方向后 修改宽高,旋转canvas后 对图片进行压缩,总是出现纯黑色的图片,所以采用了此种方法。
// base64 转 blob文件
export const dataURLtoBlob = (dataurl) => { var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], { type: mime }); } export const compressImg = (file) => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); const name = file.name; reader.onload = (e) => { const dataURL = (e.target as any).result; // 图片小于2M不压缩 if (file.size < Math.pow(1024, 2) * 2) { console.log('图片小于2m 不进行压缩'); resolve({base64: dataURL, file: file}); return; } const img: any = new Image; img.src = dataURL, img.onload = function () { const w = img.width / 2, // 宽度 h = img.height / 2, cvs = document.createElement("canvas"), o = cvs.getContext("2d"); cvs.setAttribute("width", w + ''), cvs.setAttribute("height", h + ''), o.drawImage(this, 0, 0, w, h); const i = cvs.toDataURL("image/jpeg", 0.8); // 压缩质量为 0.8 数值越小 压缩的图片越模糊 取值区间为 0 - 1 const _file: any = dataURLtoBlob(i); _file.name = name; resolve({ base64: i, file: _file }); } } }) }