File size: 7,366 Bytes
7421f15
6bbb7fb
 
 
 
 
 
 
7421f15
 
8dbd049
7421f15
8dbd049
7421f15
8dbd049
 
090921a
8dbd049
090921a
8dbd049
 
 
 
 
 
 
 
090921a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8dbd049
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
090921a
8dbd049
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
090921a
 
 
 
 
 
 
 
 
8dbd049
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
---
title: Magick 图像转换器 # 显示在 Space 页面的标题 (可自定义)
emoji: 🖼️ # Space 图标的 Emoji (可选)
colorFrom: blue # 主题颜色起始 (可选)
colorTo: green # 主题颜色结束 (可选)
sdk: docker # 指定这是一个基于 Docker 的 Space (非常重要)
app_port: 8000 # 你的 FastAPI 应用在容器内部监听的端口 (必须与 Dockerfile CMD 中指定的端口一致)
pinned: false # 是否在你的个人资料页置顶这个 Space (可选)
---

# 🧙‍♂️ Magick 动态图像转换 API (V3)

本项目提供一个基于 FastAPI 和 ImageMagick 的高性能 REST API,支持通过动态 URL 路径对图像进行多格式转换,包括动画图像处理。

## ✨ 功能特性

* **🌐 图形化界面**: 访问根路径即可使用现代化 Web 上传界面,零编程门槛
* **🎯 动态路径 API**: 通过 URL 路径直接指定目标格式、转换模式和质量参数
* **📤 双上传模式**: 支持网页表单上传和 RESTful API 调用两种方式
* **🎬 动画支持**: 完整支持 GIF、Animated WebP/AVIF/APNG 等动画格式
* **🔄 多格式转换**: 支持 AVIF、WebP、JPEG、PNG、GIF、HEIF 格式互转
* **⚙️ 灵活配置**: 支持有损/无损两种模式,质量参数可在 0-100 范围自由调节
* **🛡️ 安全可靠**: 文件大小限制、超时控制、格式验证、依赖预检查
* **🚀 性能优化**: 智能 `-coalesce` 使用、异步处理、后台清理

## 📡 API 端点

### 1. Web 上传界面 (新功能!)

**端点**: `GET /`

访问根路径即可打开用户友好的图形化上传界面,无需编程知识即可使用。

**特点**:
- 🎨 现代化响应式界面
- 📱 支持移动设备
- 🖱️ 拖拽上传支持
- 📊 实时参数预览
- 🔗 快速访问 API 文档

**表单上传端点**: `POST /`

支持通过 HTML 表单提交转换请求(与网页界面使用相同端点)。

**表单参数**:
- `file`: 图像文件(必需)
- `target_format`: 目标格式(默认: `webp`- `mode`: 转换模式(默认: `lossy`- `setting`: 质量参数 0-100(默认: `80`**示例**:
```bash
# 使用表单方式上传(与网页界面相同)
curl -X POST "http://localhost:8000/" \
  -F "file=@input.jpg" \
  -F "target_format=avif" \
  -F "mode=lossy" \
  -F "setting=85" \
  -o output.avif
```

### 2. API 端点(程序化调用)

**端点**: `POST /convert/{target_format}/{mode}/{setting}`

**路径参数**:
- `target_format`: 目标格式 (`avif` | `webp` | `jpeg` | `png` | `gif` | `heif`)
- `mode`: 转换模式 (`lossy` | `lossless`)
- `setting`: 质量/压缩参数 (0-100)
  - **lossy 模式**: `0`=最低质量,`100`=最高质量
  - **lossless 模式**: `0`=最慢/最佳压缩,`100`=最快/最低压缩

**请求体**: `multipart/form-data` 文件上传 (字段名: `file`)

**响应**: 转换后的图像文件

**支持的输入格式**: JPG, PNG, GIF, WebP, AVIF, HEIF, HEIC, BMP, TIFF

**示例**:
```bash
# 转换为高质量有损 AVIF (质量 80)
curl -X POST "https://your-api.hf.space/convert/avif/lossy/80" \
  -F "file=@input.jpg" \
  -o output.avif

# 转换为无损 WebP (最佳压缩)
curl -X POST "https://your-api.hf.space/convert/webp/lossless/0" \
  -F "file=@animation.gif" \
  -o output.webp

# 转换为中等质量 JPEG (质量 75)
curl -X POST "https://your-api.hf.space/convert/jpeg/lossy/75" \
  -F "file=@input.png" \
  -o output.jpg
```

### 3. 健康检查

**端点**: `GET /health`

**响应**: JSON 格式的服务状态信息

```json
{
  "status": "healthy",
  "imagemagick": "Version: ImageMagick 7.1.0-x",
  "avif_encoder": "/usr/bin/heif-enc",
  "disk_space": {
    "free_mb": 15234.56,
    "temp_dir": "/tmp"
  },
  "resource_limits": {
    "max_file_size_mb": 200,
    "timeout_seconds": 300
  }
}
```

## 🔧 技术细节

### 转换模式详解

#### Lossy (有损) 模式
- **AVIF**: 使用 `cq-level` 参数 (0-63),setting=100 映射为 cq=0 (最佳质量)
- **WebP**: 使用 `-quality` 参数 (0-100),直接映射
- **JPEG**: 使用 `-quality` 参数 (0-100),直接映射
- **HEIF**: 使用 `-quality` 参数 (0-100),直接映射
- **PNG/GIF**: 通过 `-colors` 减少调色板颜色模拟有损 (2-256 色)

#### Lossless (无损) 模式
- **AVIF**: 使用 `avif:lossless=true` + `avif:speed` (0-10)
- **WebP**: 使用 `webp:lossless=true` + `webp:method` (0-6)
- **PNG**: 使用 zlib 压缩级别 (0-9),映射到 `-quality` (91-100)
- **HEIF**: 使用 `heif:lossless=true` + `heif:speed` (0-10)
- **JPEG**: 使用 `-quality 100` (JPEG 无真正无损模式)
- **GIF**: 使用 `-layers optimize` 优化帧

### 性能优化

1. **智能 Coalesce**: 仅对动画格式 (GIF, WebP, APNG) 使用 `-coalesce`,避免静态图片性能损失
2. **异步处理**: 使用 asyncio 进行非阻塞 I/O 操作
3. **后台清理**: 使用 FastAPI BackgroundTasks 异步清理临时文件
4. **超时控制**: 5 分钟超时保护,防止长时间占用资源

### 安全特性

1. **文件大小限制**: 默认最大 200MB
2. **格式验证**: 仅接受白名单内的图像格式
3. **依赖预检查**: AVIF/HEIF 转换前检查 heif-enc 可用性
4. **路径隔离**: 每个请求使用独立的 UUID 临时目录
5. **错误处理**: 完整的异常捕获和 HTTP 状态码返回

## 🚀 部署

### Docker 部署

```bash
# 构建镜像
docker build -t magick-api .

# 运行容器
docker run -p 8000:8000 magick-api
```

### Hugging Face Spaces 部署

1. Fork 或上传此仓库到 Hugging Face Spaces
2. 确保 README.md 前置元数据配置正确 (`sdk: docker`, `app_port: 8000`)
3. Space 会自动构建和部署

### 环境变量

- `TEMP_DIR`: 临时文件目录 (默认: 系统临时目录,Docker 中为 `/app/temp`)
- `PORT`: 服务监听端口 (默认: 8000)

## 📦 依赖

- Python 3.10+
- FastAPI
- Uvicorn
- ImageMagick 7+
- libheif-examples (提供 heif-enc 编码器)

## 🐛 已知问题与修复

### V4 版本更新 (当前版本)

1.**新增 Web 上传界面**: 在根路径 `/` 提供现代化图形化上传界面
2.**新增表单上传 API**: 支持通过 `POST /` 使用表单数据上传
3.**代码架构重构**: 提取核心转换逻辑,实现代码复用
4.**改进用户体验**: 实时参数提示、拖拽上传、响应式设计
5.**完善 API 文档**: 在 Web 界面提供快速访问链接

### V3 版本修复

1.**修复 Timeout 实现**: 超时现在正确应用于进程执行而非进程创建
2.**修复 WebP 无损质量**: 无损模式下 quality 固定为 100
3.**修复 PNG 质量映射**: 修正为完整的 91-100 范围
4.**修复 WebP effort 计算**: 使用线性插值确保精确映射 0-6
5.**修复临时目录硬编码**: 支持环境变量和系统临时目录
6.**优化 -coalesce 性能**: 仅对动画格式使用
7.**修复 BackgroundTasks**: 移除重复参数传递
8.**添加文件格式验证**: 上传前验证文件扩展名
9.**添加依赖预检查**: AVIF/HEIF 转换前检查编码器可用性
10.**修复测试脚本**: 使用正确的 API 路径格式

## 📄 许可证

本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件

## 🤝 贡献

欢迎提交 Issue 和 Pull Request!

## 📞 联系方式

如有问题或建议,请在 GitHub Issues 中提出。