Skip to content

compressToTargetSize

压缩图片到指定的目标文件大小,通过迭代调整图片质量和尺寸。

前置依赖

依赖参数

参数名类型说明
deps.ImageWindow['Image']Image 构造函数
deps.FileWindow['File']File 构造函数
deps.createObjectURL(blob: File) => string创建对象 URL
deps.revokeObjectURL(url: string) => void释放对象 URL

环境要求

  • 浏览器环境: 使用 Canvas API、Image API 和 URL API

函数签名

typescript
function compressToTargetSize(
  file: File,
  options?: CompressOptions,
  deps: CompressToTargetSizeDeps
): Promise<File>

interface CompressOptions {
  targetSize?: number      // 目标文件大小(字节),默认 30KB
  maxIterations?: number   // 最大尝试次数,默认 30
  mimeType?: string        // 输出格式,默认 'image/jpeg'
}

interface CompressToTargetSizeDeps {
  Image: Window['Image']
  File: Window['File']
  createObjectURL: (blob: File) => string
  revokeObjectURL: (url: string) => void
}

参数

参数名类型必填默认值说明
fileFile-要压缩的图片文件
options.targetSizenumber30720 (30KB)目标文件大小(字节)
options.maxIterationsnumber30最大迭代次数
options.mimeTypestring'image/jpeg'输出图片格式
depsCompressToTargetSizeDeps-依赖注入对象

返回值

类型说明
Promise<File>Promise,解析为压缩后的图片 File 对象

工作原理

  1. 检查原文件大小,如果已小于目标大小,直接返回
  2. 使用 Image 对象加载原始图片,获取宽高
  3. 开始迭代压缩(最多 maxIterations 次):
    • 计算当前压缩比例 = 目标大小 / 当前大小
    • 根据压缩比例调整图片质量和尺寸
    • 使用 Canvas 绘制调整后的图片
    • 使用 canvas.toBlob() 生成新的图片 Blob
    • 检查新图片大小是否接近目标
  4. 如果在最大迭代次数内达到目标大小(误差±10%),停止迭代
  5. 将最终的 Blob 转换为 File 对象并返回
  6. 释放所有创建的对象 URL

算法使用二分查找思想逐步逼近目标大小,优先调整质量,必要时调整尺寸。