compressToTargetSize
压缩图片到指定的目标文件大小,通过迭代调整图片质量和尺寸。
前置依赖
依赖参数
| 参数名 | 类型 | 说明 |
|---|---|---|
deps.Image | Window['Image'] | Image 构造函数 |
deps.File | Window['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
}参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
file | File | 是 | - | 要压缩的图片文件 |
options.targetSize | number | 否 | 30720 (30KB) | 目标文件大小(字节) |
options.maxIterations | number | 否 | 30 | 最大迭代次数 |
options.mimeType | string | 否 | 'image/jpeg' | 输出图片格式 |
deps | CompressToTargetSizeDeps | 是 | - | 依赖注入对象 |
返回值
| 类型 | 说明 |
|---|---|
Promise<File> | Promise,解析为压缩后的图片 File 对象 |
工作原理
- 检查原文件大小,如果已小于目标大小,直接返回
- 使用 Image 对象加载原始图片,获取宽高
- 开始迭代压缩(最多 maxIterations 次):
- 计算当前压缩比例 = 目标大小 / 当前大小
- 根据压缩比例调整图片质量和尺寸
- 使用 Canvas 绘制调整后的图片
- 使用
canvas.toBlob()生成新的图片 Blob - 检查新图片大小是否接近目标
- 如果在最大迭代次数内达到目标大小(误差±10%),停止迭代
- 将最终的 Blob 转换为 File 对象并返回
- 释放所有创建的对象 URL
算法使用二分查找思想逐步逼近目标大小,优先调整质量,必要时调整尺寸。