python-tinypng/README.md

327 lines
7.7 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 的批量图片压缩和格式转换工具。它提供图形界面和命令行两种使用方式,支持多个 API Key 接力使用、官方额度同步、批量格式转换、递归处理目录、HTTP/SOCKS5 代理,以及 Windows 二进制打包分发。
## 功能
- GUI 图形界面,适合日常批量处理图片。
- CLI 命令行入口,适合脚本化或自动化处理。
- 支持多个 Tinify API Key每个 Key 默认每月 500 张额度。
- 支持处理前同步官方本月已用额度。
- 支持 PNG、JPG/JPEG、WebP、AVIF 输入。
- 支持输出源格式、PNG、JPEG、WebP、AVIF也可以一次输出全部格式。
- 支持递归扫描目录。
- 支持覆盖已有输出文件或跳过已有文件。
- 支持试运行,只预览处理计划,不调用 Tinify API。
- 支持 HTTP 代理和 SOCKS5 代理。
## 目录说明
```text
C:\dev\py\tinypng
├─ source\ 默认输入目录,把待处理图片放这里
├─ optimized\ 默认输出目录,运行后自动生成
├─ tinypng_gui.py GUI 程序
├─ tinypng_balancer.py 命令行和核心处理逻辑
├─ run_gui.bat 双击启动 GUI
├─ tinify_keys.sample.json API Key 配置模板
├─ tinify_keys.json 实际 API Key 配置文件,本地使用,不提交 Git
├─ tinify_usage.json 本月额度缓存文件,本地使用,不提交 Git
├─ pyproject.toml uv 项目依赖配置
└─ uv.lock uv 锁定文件
```
打包后使用 `--onedir` 文件夹版时,默认目录会改为可执行文件所在目录:
```text
dist\tinypng-gui
├─ tinypng-gui.exe
├─ _internal\
├─ source\
├─ optimized\
├─ tinify_keys.json
└─ tinify_usage.json
```
`source`、`optimized` 和 JSON 配置文件不会放到 `_internal` 里。
## 安装依赖
项目使用 `uv` 管理依赖:
```powershell
cd C:\dev\py\tinypng
uv sync
```
主要依赖:
- `tinify`TinyPNG 官方 Python SDK。
- `requests[socks]`:为 HTTP/SOCKS5 代理提供支持。
- `pyinstaller`:开发依赖,用于打包 Windows 二进制。
## 启动 GUI
推荐直接双击:
```text
run_gui.bat
```
也可以在命令行运行:
```powershell
cd C:\dev\py\tinypng
uv run tinypng_gui.py
```
## 配置 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`,它只作为模板示例。
## 代理格式
不需要代理时留空。
HTTP 代理:
```text
http://127.0.0.1:7890
```
SOCKS5 代理:
```text
socks5://127.0.0.1:1080
```
带账号密码:
```text
http://username:password@127.0.0.1:7890
socks5://username:password@127.0.0.1:1080
```
常见代理软件的 HTTP 端口可能是 `7890`、`10809`SOCKS5 端口可能是 `1080`、`10808`。以代理软件里实际显示的端口为准。
## GUI 使用流程
1. 把图片放入 `source` 文件夹,或在界面中选择其他输入目录。
2. 点击 `填写 API Key`,粘贴一个或多个 API Key 并保存。
3. 如需代理,在代理输入框填写 HTTP 或 SOCKS5 地址。
4. 确认输出目录,默认是 `optimized`
5. 按需选择转换格式、递归扫描、覆盖输出、试运行、同步官方额度等选项。
6. 点击 `开始处理`
## 转换格式
`转换格式` 默认选择 `源格式``webp`
可选值:
- `源格式`:只压缩,不改变格式。
- `png`:输出 PNG。
- `jpeg` / `jpg`:输出 JPEG。
- `webp`:输出 WebP。
- `avif`:输出 AVIF。
- `all`命令行专用一次输出源格式、PNG、JPEG、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 --resize-method fit --width 1200 --height 1200
```
试运行:
```powershell
uv run tinypng_balancer.py source -o optimized --dry-run
```
跳过启动前官方额度同步:
```powershell
uv run tinypng_balancer.py source -o optimized --no-sync-usage
```
指定配置和用量文件:
```powershell
uv run tinypng_balancer.py source -o optimized --config tinify_keys.json --state tinify_usage.json
```
生成配置模板:
```powershell
uv run tinypng_balancer.py --init-config tinify_keys.json
```
## 打包 Windows 二进制
推荐打包为 `onedir` 文件夹版:
```powershell
uv run pyinstaller --noconfirm --clean --onedir --windowed --name tinypng-gui --add-data "tinify_keys.sample.json;." tinypng_gui.py
```
输出目录:
```text
dist\tinypng-gui\
```
启动文件:
```text
dist\tinypng-gui\tinypng-gui.exe
```
分发时需要把整个 `dist\tinypng-gui\` 文件夹一起发出去,因为 `_internal\` 里包含运行依赖。
不推荐日常使用 `--onefile` 单文件版。单文件版启动时会先解压依赖到系统临时目录;文件夹版不会把依赖释放到 Temp路径也更容易管理。
## Git 忽略
以下文件通常不需要提交:
```gitignore
tinify_keys.json
tinify_usage.json
optimized
source
build/
dist/
*.spec
*.exe
```
是否提交 `pyproject.toml` 中的 `pyinstaller` 开发依赖,取决于是否希望项目自带打包能力。当前项目保留该开发依赖,方便以后重复打包。
## 常见问题
### 提示 No module named 'tinify'
请使用 `uv run` 启动:
```powershell
uv run tinypng_gui.py
```
或者双击 `run_gui.bat`
### 填写 socks5:// 代理后提示缺少 SOCKS 支持
确认已经安装 SOCKS 依赖:
```powershell
uv sync
```
如果是旧环境,可以重新添加依赖:
```powershell
uv add requests[socks]
```
然后重新打包二进制。
### 打包版路径指向 _internal
请使用新版代码重新打包。GUI 会在打包环境中使用 `tinypng-gui.exe` 所在目录作为默认目录,不会把 `source`、`optimized`、`tinify_keys.json` 放进 `_internal`
### 没有找到图片
确认图片放在输入目录中。支持的扩展名包括:
```text
.png .jpg .jpeg .webp .avif
```
### API Key 不可用
检查 `tinify_keys.json` 中是否写入了真实 Key。模板中的 `YOUR_TINIFY_API_KEY_1` 不能直接使用。
### 全部格式输出时额度消耗变多
这是正常的。因为每张图片会分别转换为多个格式,每个输出都可能消耗 Tinify 额度。