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" });
|
}
|