开发者
压缩与放大都是异步任务:上传拿到任务号,查询时可以让服务端等到完成再回,再下载产物。三个请求,任何语言都能接。
认证
在工作台创建 API Key,放进 Authorization 头。Key 只在创建时完整显示一次,服务端只保存散列。
Authorization: Bearer lp_live_a8f3k2…
快速开始
-
上传图片,拿到任务号
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-…" } } -
查询结果,带上 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" } } -
下载产物,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 给出完整契约。
| 通道 | 状态 | 说明 |
|---|---|---|
| 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 分钟有效的签名链接。