python-tinypng/README.md

201 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# TinyPNG 批量压缩工具
这是一个基于 Tinify/TinyPNG Python SDK 的批量图片压缩和格式转换工具。支持 GUI 界面、多个 API Key 按顺序接力使用、官方额度同步、批量转换格式,以及递归处理目录。
## 功能
- 图形界面选择输入目录和输出目录。
- 支持多个 Tinify API Key每个 Key 默认每月 500 张额度,处理时会先用完前一个 Key再切换到下一个。
- 启动处理前可同步官方本月已用额度。
- 支持 PNG、JPG/JPEG、WebP、AVIF 图片。
- 支持转换为 png、jpeg、webp、avif也支持“全部格式”一次输出四种格式。
- 支持递归扫描目录。
- 支持覆盖已有输出文件或跳过已有文件。
- 支持试运行,只预览计划,不调用 Tinify API。
## 目录说明
```text
C:\dev\py\tinypng
├─ source\ 默认输入目录,把待处理图片放这里
├─ optimized\ 默认输出目录,运行后自动生成
├─ tinypng_gui.py GUI 程序
├─ tinypng_balancer.py 命令行和核心处理逻辑
├─ run_gui.bat 双击启动 GUI
├─ tinify_keys.json 实际 API Key 配置文件
├─ tinify_usage.json 本月额度缓存文件,运行后自动生成
├─ pyproject.toml uv 项目依赖配置
└─ uv.lock uv 锁定文件
```
## 启动 GUI
推荐直接双击:
```text
run_gui.bat
```
也可以在命令行运行:
```powershell
cd C:\dev\py\tinypng
uv run tinypng_gui.py
```
程序通过 `uv run` 启动,会自动使用 `pyproject.toml` 中声明的 `tinify` SDK 依赖。
## 配置 API Key
打开 GUI 后点击 `填写 API Key`
支持以下输入方式:
```text
KEY_1
KEY_2
KEY_3
```
也支持用逗号、分号或空格分隔。保存后会生成 `tinify_keys.json`,主界面的“配置文件”会自动指向该文件。
配置文件格式示例:
```json
{
"api_keys": [
{
"key": "YOUR_TINIFY_API_KEY_1",
"monthly_limit": 500,
"name": "账号-1"
},
{
"key": "YOUR_TINIFY_API_KEY_2",
"monthly_limit": 500,
"name": "账号-2"
}
],
"proxy": null
}
```
不要把真实 API Key 写入 `tinify_keys.sample.json`,它只作为模板示例。
## GUI 使用流程
1. 把图片放入当前目录下的 `source` 文件夹。
2. 双击 `run_gui.bat` 打开界面。
3. 点击 `填写 API Key`,粘贴一个或多个 API Key 并保存。
4. 确认输入目录为 `source`
5. 选择输出目录,默认是 `optimized`
6. 按需选择转换格式、递归扫描、覆盖输出、同步官方额度等选项。
7. 点击 `开始处理`
## 转换格式
`转换格式` 默认是 `保持原格式`
可选值:
- `源格式`:只压缩,不改变格式。
- `png`:输出 PNG。
- `jpeg` / `jpg`:输出 JPEG。
- `webp`:输出 WebP。
- `avif`:输出 AVIF。
- 可多选,例如默认会同时选择 `源格式``webp`,每张图片会输出源格式压缩结果和 WebP 结果。
- 命令行的 `all` 会输出源格式、`.png`、`.jpg`、`.webp`、`.avif`。
注意:转换、缩放等 Tinify API 操作可能会消耗压缩额度。“全部格式”会为每张输入图片生成多个输出,因此额度消耗也会更多。
## 额度同步
GUI 默认勾选 `同步官方额度`
处理开始前,程序会对每个 API Key 调用官方 SDK 的 `tinify.validate()`,然后读取 `tinify.compression_count`,同步该 Key 本月已经使用的数量。
同步后的额度会写入:
```text
tinify_usage.json
```
后续每次处理成功后,程序也会读取 SDK 更新后的 `tinify.compression_count` 并回写本地用量缓存。
## 命令行用法
压缩目录:
```powershell
uv run tinypng_balancer.py source -o optimized
```
递归压缩:
```powershell
uv run tinypng_balancer.py source -o optimized --recursive
```
转换为 WebP
```powershell
uv run tinypng_balancer.py source -o optimized --convert webp
```
同时输出源格式和 WebP
```powershell
uv run tinypng_balancer.py source -o optimized --convert source --convert webp
```
输出全部格式:
```powershell
uv run tinypng_balancer.py source -o optimized --convert all
```
试运行:
```powershell
uv run tinypng_balancer.py source -o optimized --dry-run
```
跳过启动前官方额度同步:
```powershell
uv run tinypng_balancer.py source -o optimized --no-sync-usage
```
## 常见问题
### 提示 No module named 'tinify'
请使用 `uv run` 启动:
```powershell
uv run tinypng_gui.py
```
或者双击 `run_gui.bat`
### 没有找到图片
确认图片放在输入目录中。默认输入目录是:
```text
C:\dev\py\tinypng\source
```
支持的扩展名包括:
```text
.png .jpg .jpeg .webp .avif
```
### API Key 不可用
检查 `tinify_keys.json` 中是否写入了真实 Key。模板中的 `YOUR_TINIFY_API_KEY_1` 不能直接使用。
### 全部格式输出时额度消耗变多
这是正常的。因为每张图片会分别转换为 PNG、JPEG、WebP、AVIF 四种格式,每个输出都可能消耗 Tinify 额度。