const compressAndConvertToTiff = (file: any) => {
return new Promise((resolve, reject) => {
const img = new Image();
img.src = URL.createObjectURL(file);
img.onload = () => {
const canvas = document.createElement('canvas');
const ctx: any = canvas.getContext('2d');
const MAX_WIDTH = 1024; // 最大宽度
const MAX_HEIGHT = 2000; // 最大高度
let width = img.width;
let height = img.height;
// 计算宽高比,缩放图片
if (width > height) {
if (width > MAX_WIDTH) {
height *= MAX_WIDTH / width;
width = MAX_WIDTH;
}
} else {
if (height > MAX_HEIGHT) {
width *= MAX_HEIGHT / height;
height = MAX_HEIGHT;
}
}
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, width, height);
// 压缩并转换为 TIFF 格式的递归函数
const tryCompress = (quality: number) => {
canvas.toBlob(
(blob) => {
if (blob) {
const fileSize = blob.size; // 直接获取字节数
console.log('fileSize', fileSize);
const fileSizeMB = fileSize / (1024 * 1024); // 转换为 MB
console.log(`当前压缩质量:${quality},文件大小:${fileSizeMB.toFixed(2)}MB`);
if (fileSizeMB <= 2) {
// 如果文件大小小于或等于 2MB,转换为 TIFF 格式
const tiffFile = new File([blob], file.name.replace(/\.\w+$/, '.tiff'), { type: 'image/tiff' });
resolve(tiffFile);
} else {
// 如果文件大于 2MB,降低压缩质量并再次尝试
if (quality > 0.1) {
tryCompress(quality - 0.05); // 递归降低质量
} else {
reject(new Error('无法将图片压缩到 2MB 以下并转换为 TIFF 格式'));
}
}
} else {
reject(new Error('图片压缩失败'));
}
},
file.type,
quality
);
};
tryCompress(0.9); // 初始质量设置为 0.9
};
img.onerror = () => {
reject(new Error('图片加载失败'));
};
});
};
图片压缩至2M以下,并输出为tiff格式
于 2024-12-03 11:17:42 首次发布