export function compress(fileObj, callback) { try { const image = new Image(); image.src = URL.createObjectURL(fileObj); image.onload = function() { const that = this; // 默认按比例压缩 let w = that.width; let h = that.height; const scale = w / h; w = fileObj.width || w; h = fileObj.height || w / scale; let quality = 0.7; // 默认图片质量为0.7 // 生成canvas const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); // 创建属性节点 const anw = document.createAttribute("width"); anw.nodeValue = w; const anh = document.createAttribute("height"); anh.nodeValue = h; canvas.setAttributeNode(anw); canvas.setAttributeNode(anh); ctx.drawImage(that, 0, 0, w, h); // 图像质量 if (fileObj.quality && fileObj.quality <= 1 && fileObj.quality > 0) { quality = fileObj.quality; } // quality值越小,所绘制出的图像越模糊 const data = canvas.toDataURL("image/jpeg", quality); // 压缩完成执行回调 const newFile = convertBase64UrlToBlob(data); callback(newFile); }; } catch (e) { console.log("压缩失败!"); } } function convertBase64UrlToBlob(urlData) { const bytes = window.atob(urlData.split(",")[1]); // 去掉url的头,并转换为byte // 处理异常,将ascii码小于0的转换为大于0 const ab = new ArrayBuffer(bytes.length); const ia = new Uint8Array(ab); for (let i = 0; i < bytes.length; i++) { ia[i] = bytes.charCodeAt(i); } return new Blob([ab], { type: "image/png" }); }