图片压缩至2M以下,并输出为tiff格式

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('图片加载失败'));
    };
  });
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值