更新记录

1.0.0(2026-07-25)

  • 首发:Android / iOS / HarmonyOS 三端统一 API
  • 接近微信朋友圈的自适应图片压缩
  • 批量压缩、进度回调、任务取消
  • 可选参数:ignoreBy / quality / focusAlpha / excludeGif / maxConcurrency / targetDir / renamePrefix
  • 多语言:zh-Hans / en
  • Demo:压缩前后分辨率、体积、压缩率比对

平台兼容性

uni-app(4.18)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × 5.0 4.18
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × - - - -

其他

多语言 暗黑模式 宽屏模式

ly028-Compress

扫码下载体验
📱 下载体验 APK

三端(Android / iOS / HarmonyOS)UTS 图片压缩插件。接近微信朋友圈的画质与体积策略,异步压缩、进度回调、可取消。

安装

将本插件放入项目的 uni_modules/ly028-Compress 目录(插件市场导入或手动拷贝均可)。

import {
  compressImagesAsync,
  cancelCompress,
  setLocale,
  getLocale
} from '@/uni_modules/ly028-Compress'

快速开始

uni.chooseImage({
  count: 9,
  sizeType: ['original'],
  success: (res) => {
    const jobId = compressImagesAsync(
      { paths: res.tempFilePaths },
      (progressJson) => {
        const p = JSON.parse(progressJson)
        // p.percent / p.current / p.total / p.phase / p.path
        console.log(p.percent)
      },
      (resultJson) => {
        const res = JSON.parse(resultJson)
        if (res.code !== 0) {
          uni.showToast({ title: res.msg || 'compress failed', icon: 'none' })
          return
        }
        const data = typeof res.data === 'string' ? JSON.parse(res.data) : res.data
        // data.files: 每张图的压缩结果
        console.log(data.files)
      }
    )
    // 需要中途停止时:
    // cancelCompress(jobId)
  }
})

API

方法 说明 返回值
compressImagesAsync(options, , onComplete) 批量异步压缩 jobId(number,失败启动时可能为 0
cancelCompress(jobId) 取消指定任务 boolean
setLocale(locale) 设置插件内文案语言:zh-Hans / en void
getLocale() 获取当前语言 string

压缩在后台线程执行,不会阻塞 UI。onProgress / onComplete 回到主线程,可直接更新界面。


compressImagesAsync

compressImagesAsync(
  options: CompressImagesOptions,
  : ((json: string) => void) | null,
  onComplete: ((result: string) => void) | null
): number

options

字段 类型 默认 说明
paths string[] 必填 图片路径列表;单张也请传数组
targetDir string _doc/ly028-compress 输出目录;不传则写入应用文档目录下插件子目录(可直接用于预览)
ignoreBy number 100 小于该体积(KB)的图片不压缩,直接保留/拷贝
quality number 自适应 可选,范围建议 5–95。不传则使用插件自适应策略(普通图固定质量,长图按目标体积自动搜索);传入则强制该 JPEG 质量
focusAlpha boolean false true:PNG / WebP 尽量保留透明通道;false:统一输出 JPEG
excludeGif boolean true true:跳过 GIF;false:按静态图尝试处理
maxConcurrency number 3 批量并发数,范围 1–8
renamePrefix string compress_ 输出文件名前缀。最终文件名形如:{prefix}{时间戳}_{序号}.{扩展名}

需要特殊文件名时:压缩完成后读取结果里的 outputPath,再自行拷贝/重命名即可。

onProgress(JSON 字符串)

字段 类型 说明
percent number 0–100
current number 已完成张数
total number 总张数
path string 当前处理的路径(可能为空)
phase string start / compressing / item_done / done

onComplete(JSON 字符串信封)

{
  "code": 0,
  "subCode": 0,
  "msg": "ok",
  "data": "{ ... }"
}
字段 说明
code 0 成功,非 0 失败
subCode 细分错误码(可选)
msg 提示文案(随 setLocale 变化)
data 成功时为 JSON 字符串,需再 JSON.parse

data 解析后:

字段 类型 说明
files array 每张图的结果
successCount number 成功数
failCount number 失败数
jobId number 任务 ID

files[] 单项

字段 类型 说明
sourcePath string 原图路径
outputPath string 压缩后路径(失败可能为空)
originalSize number 原图像素体积(字节)
compressedSize number 压缩后体积(字节)
originalWidth / originalHeight number 原图宽高
width / height number 输出宽高
format string jpeg / png / webp
costMs number 单张耗时(毫秒)
skipped boolean 是否因体积过小等原因跳过压缩
keptOriginal boolean 压缩后更大时是否回退为原图数据

cancelCompress

cancelCompress(jobId: number): boolean

取消后,该任务的 onComplete 仍可能回调一次(失败信封,提示已取消)。

setLocale / getLocale

setLocale('zh-Hans') // 或 'en'
getLocale()          // 当前语言

影响插件返回的 msg 等内置文案;不影响你业务 UI 自己的多语言。

使用注意

  1. 路径:相册与拍照返回的临时路径均可传入 paths。请使用 uni.chooseImage / 本地文件路径;插件会做常见路径归一化。
  2. 展示图片:App 端 <image> 对绝对路径有时需加 file:// 前缀,例如 file:///data/.../xxx.jpguni.previewImage 一般可直接使用返回路径。
  3. 输出目录:未指定 targetDir 时写入 _doc/ly028-compress/(应用文档目录),返回路径为 _doc/... 形式,可直接给 <image> / uni.previewImage 使用。正式业务仍可再拷贝到其它持久位置或上传后自行管理。
  4. 体积策略:小于 ignoreBy(默认 100KB)通常不压;压缩后若比原图更大,会回退保留原图数据(keptOriginal: true)。

平台

平台 要求
Android API 21+,高性能 JPEG 编码
iOS iOS 12+
HarmonyOS 支持 ArkTS 图片编解码的版本

需在 App 真机或自定义基座中验证原生能力(HBuilderX 标准运行可能无法完整测试 UTS 原生插件)。

体验

扫码下载体验
📱 下载体验 APK

隐私、权限声明

1. 本插件需要申请的系统权限列表:

READ_EXTERNAL_STORAGE(API≤32)、READ_MEDIA_IMAGES(API≥33)、CAMERA(选图/拍照由前端触发)。默认输出写应用私有文档目录,一般无需额外存储授权。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据。所有图片压缩在设备端离线完成,不上传任何媒体数据。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: