开发者

压缩与放大都是异步任务:上传拿到任务号,查询时可以让服务端等到完成再回,再下载产物。三个请求,任何语言都能接。

认证

在工作台创建 API Key,放进 Authorization 头。Key 只在创建时完整显示一次,服务端只保存散列。

Authorization: Bearer lp_live_a8f3k2…

快速开始

  1. 上传图片,拿到任务号

    curl -X POST https://lubanpng.wizthink.cn/v1/images/compress \
      -H "Authorization: Bearer lp_live_…" \
      -F "file=@photo.png"
    
    { "code": 0, "msg": "success", "data": { "task_id": "550e8400-…" } }
  2. 查询结果,带上 wait 让服务端最多等 30 秒

    curl "https://lubanpng.wizthink.cn/v1/images/compress/550e8400-…?wait=30" \
      -H "Authorization: Bearer lp_live_…"
    
    { "code": 0, "data": { "status": "completed",
        "original_size": 2516582, "compressed_size": 933241,
        "output_format": "jpeg", "quota_units": 1,
        "compressed_url": "/v1/images/download/550e8400-….jpg" } }
  3. 下载产物,24 小时内有效

    curl -o photo.min.jpg "https://lubanpng.wizthink.cn/v1/images/download/550e8400-….jpg"

端点

方法 路径与用途 鉴权
POST /v1/images/compress · 上传一张图,入队压缩,产出更小文件时计 1 次;带 convert 转换格式再计 1 次 Key / 会话 / 匿名
POST /v1/images/upscale · 上传一张 PNG / JPEG 静态图,按 2× 或 4× 放大,成功计 1 次 Key / 会话 / 匿名
GET /v1/images/compress/{task_id} · 任务状态,可选 wait 长轮询 同上
GET /v1/images/download/{filename} · 下载产物 同上
GET /v1/me · 当前身份、套餐、本期额度与重置时间 同上
POST /v1/auth/otp · 发送邮箱验证码 无
POST /v1/auth/verify · 验证码换登录会话 无
GET /v1/me/api-keys · 列出 Key;POST 新建,DELETE 吊销 会话

格式转换

上传时带 convert 字段即可把静态图转成 png、jpeg、webp 或 avif。目标格式与原格式相同时按普通压缩处理,只计 1 次;不同则在压缩之外额外计 1 次。透明图转 JPEG 必须用 background 指定 #RRGGBB 背景色,否则任务失败并退回全部次数。动图(GIF、APNG、动态 WebP)暂不支持转换,只做保留动画的压缩。任务状态里的 target_format、output_format、quota_units 分别给出目标格式、实际产物格式与本次计次。

curl -X POST https://lubanpng.wizthink.cn/v1/images/compress \
  -H "Authorization: Bearer lp_live_…" \
  -F "file=@cutout.png" \
  -F "convert=jpeg" \
  -F "background=#ffffff"

{ "code": 0, "data": { "status": "completed", "target_format": "jpeg",
    "output_format": "jpeg", "quota_units": 2,
    "compressed_url": "/v1/images/download/550e8400-….jpg" } }
格式 输入 转换目标 说明
PNG / APNG 支持 支持 APNG 逐帧量化并保留动画
JPEG 支持 支持 透明图转 JPEG 需要 background
GIF 支持 不作为转换目标 动画逐帧量化,帧间隔与循环保留
WebP 支持 支持 动态 WebP 逐帧重编码
AVIF 支持 支持 静态图
HEIC / HEIF API 不支持 不支持 网页在 iPhone Safari 选图时自动转成 JPEG 上传;CLI 在 macOS 上用系统转换器转成 JPEG 后上传;API 直传返回 1001

图片放大

POST /v1/images/upscale 接收静态 PNG 或 JPEG,按 scale(x2 / x4)放大,产物固定为 PNG。任务模型与压缩一致:上传拿到任务号,用同一组查询与下载端点取回结果。

curl -X POST https://lubanpng.wizthink.cn/v1/images/upscale \
  -H "Authorization: Bearer lp_live_…" \
  -F "file=@logo.png" \
  -F "scale=x2"

{ "code": 0, "msg": "success", "data": { "task_id": "550e8400-…" } }
curl "https://lubanpng.wizthink.cn/v1/images/compress/550e8400-…?wait=30" \
  -H "Authorization: Bearer lp_live_…"

{ "code": 0, "data": { "status": "completed", "kind": "upscale",
    "scale": "x2", "original_size": 398829, "compressed_size": 1194351,
    "output_format": "png", "quota_units": 1, "no_gain": false,
    "compressed_url": "/v1/images/download/550e8400-….png" } }
项目 上限
输入格式 PNG / JPEG(静态图,动图暂不支持)
倍数与产物 x2 或 x4;产物固定为 PNG
输入体积 20 MB 以内
输入尺寸 2.25MP 以内,单边不超过 2048
产物体积 64 MB 以内

放大在 GPU 上单飞:同一时刻只处理一个任务,繁忙时排队(队列深度上限 10,超限返回 429 并带 Retry-After 与 queue_depth);放大服务不可用时提交直接返回 503。

成功放大计 1 次,与压缩共用同一份额度;失败、超时、格式不符或超出上限都不计次。放大产物必然比原图大,因此不适用压缩的「更小才计次」规则;任务状态里 quota_units 为实扣次数,no_gain 仅在失败时为 true。

额度与错误

每个响应都带三个额度头,只有真正产出更小文件才计一次,失败或压缩后没有变小自动退回(未转换时保留原图;显式转换即使产物不小于原图也会返回转换结果,但不计次);格式转换额外计 1 次。任务状态里的 quota_units 在非终态是预扣次数(预计),终态是实扣次数;no_gain 为 true 当且仅当本次未计次。

X-Quota-Limit: 50
X-Quota-Remaining: 46
X-Quota-Reset: 2026-10-01T00:00:00Z
HTTP code 含义
400 1001 参数错误,如缺少 file 字段、convert 或 background 不合法、HEIC 等不支持的格式
413 1004 文件超过当前套餐上限
401 4001 未登录或 Key 无效、已吊销
429 4003 本期额度用尽,响应里给出重置时间
404 3003 任务或产物不存在、已过期
500 2002 压缩失败,任务标记 failed,不扣次

For AI agents

机器可读入口:llms.txt 汇总双能力、额度与接入通道;OpenAPI 给出完整契约。

llms.txt · 机器可读摘要

OpenAPI · 完整契约

通道 状态 说明
REST + API Key 可用 压缩与放大共用同一套端点与额度;浏览器可用匿名 Cookie
MCP server 可用 POST /mcp:压缩、放大、额度查询与任务查询工具;单会话小额度免费

CLI

走同一套 API 与额度。登录一次,Key 存在本机用户配置目录(macOS / Linux 为 ~/.config/lubanpng,Windows 为 %APPDATA%\lubanpng)。

npm i -g lubanpng

Node 24+,macOS / Linux / Windows。

$ lubanpng login
  粘贴你的 API Key: lp_live_…
  已登录 zibin@example.com · 本月剩余 46 次

$ lubanpng compress ./images --out ./dist --recursive
  photo_banner.jpg   2.40 MB → 0.89 MB   -63%
  logo@2x.png         312 KB →   96 KB   -69%
  sticker_wave.gif   1.10 MB → 0.71 MB   -36%
  本次 3 张,节省 2.11 MB,本月剩余 43 次

$ lubanpng compress ./hero.png --convert webp
  hero.png           1.20 MB → 0.31 MB   -74%   → hero.webp
  本次 1 张,节省 0.89 MB,本月剩余 41 次,1 张已转换

$ lubanpng usage
  免费套餐 · 本月已用 7 / 50 · 10 月 1 日重置
command 含义
login / logout 保存或清除本机 Key;也可用环境变量 LUBANPNG_API_KEY
compress 文件或目录;--out 输出目录,--in-place 原地覆盖,--recursive 递归,--concurrency 并发数,--convert 转换格式(png / jpeg / webp / avif),--background 透明图转 JPEG 的背景色;macOS 上 HEIC 先由系统转成 JPEG 再上传
usage 套餐、本期用量与重置时间

常见问题

免费额度有多少?

匿名每天 5 次,注册后每月 50 次;网页、API 和 CLI 共用同一份额度,放大与压缩同池。

什么时候会扣次数?

压缩只有真正产出更小的文件才计 1 次;失败、结果没变小都不计。显式要求格式转换额外计 1 次(目标格式与原格式相同只计 1 次)。放大成功计 1 次。

支持哪些格式?动图会丢动画吗?

压缩支持 PNG、JPEG、GIF、WebP、AVIF,APNG、GIF 与动态 WebP 会保留动画;静态图可转成 png / jpeg / webp / avif。放大仅支持静态 PNG、JPEG,可选 2× 或 4×。

怎么在脚本或 CI 里批量压缩?

用 CLI:lubanpng compress ./images --out ./dist --recursive(支持 --in-place、--concurrency、--convert、--background);服务端可调 REST API,登录后创建 API Key 即可在任意语言使用。

上传的文件保留多久?下载链接会过期吗?

免费与匿名任务的文件保留 24 小时,到期自动清理;下载走 10 分钟有效的签名链接。