# rembg HTTP API 教程：上传图片、指定模型与 PNG 响应校验

通过本机 /api/remove 上传原创图片，显式提交 u2netp，并在保存前核对状态码、Content-Type 和真实图像内容。

本页 rembg/u2netp 已在 CPU 实际执行。本机服务返回200 image/png，像素与库调用一致；耳机细线遗漏仍需人工处理。

## 逐步操作

### 1. 先检查原创输入与上传脚本

使用 input.png 耳机杯子图，不上传客户素材。upload.py 只请求显式传入的 localhost 服务，默认不读密钥，不把返回文本直接写成 PNG。

```bash
python3 verify.py
```

### 2. 安装官方服务所需 extra

使用 Python 3.11–3.13 的隔离环境安装官方 CPU/CLI extra；服务额外依赖以实际版本为准。本文固定 2.0.85，官方入口是 rembg s，而不是 openai serve。

```bash
python3 -m venv .venv
.venv/bin/python -m pip install "rembg[cpu,cli]==2.0.85" pillow
```

### 3. 绑定 localhost 并打开 API 文档

执行下方命令，在浏览器打开 http://127.0.0.1:7041/api。选择 POST /api/remove 的文件上传入口；--no-ui 只关闭 Gradio，OpenAPI 文档仍在。本机演示不应照抄公开监听。

```bash
.venv/bin/rembg s --host 127.0.0.1 --port 7041 --no-ui
```

### 4. 同时提交 file 和 model 表单字段

官方 POST 使用 Form model；本练习显式选 u2netp，避免默认模型触发不同权重与许可。不要把 API Key 或 apizt Base URL 填到这个本地专用接口。

```bash
.venv/bin/python upload.py --url http://127.0.0.1:7041/api/remove
```

### 5. 检查状态、类型和完整图像再保存

upload.py 先检查 HTTP 成功和 image/png，再用 Pillow load 完整解码，确认 RGBA 和画布，最后写临时文件并替换。HTML 错误页、200 JSON 错误和破损 PNG 都不得成为 output.png。

```bash
python3 verify.py --results output
```

### 6. 用坏响应验证下载保护

运行 test_upload.py 的本地假服务：分别发送 200 HTML、200 JSON、破损 PNG 与有效 PNG。它验证客户端保护逻辑，不是官方模型推理，也不代表官方服务一定返回这些错误。

```bash
python3 test_upload.py
```

### 7. 分别保留服务实跑与客户端测试记录

official-http.json 若存在，记录的是实际 rembg 服务上传；fixture-tests.json 是本地客户端负例测试。两者不混写成“生产接口全部通过”。关闭本练习服务时仅终止自己启动的进程。

```bash
python3 verify.py --results output
```

## 来源与边界

- [rembg HTTP 服务入口](https://github.com/danielgatis/rembg/blob/v2.0.85/README.md)
- [POST form、模型字段与 image/png 响应源码](https://github.com/danielgatis/rembg/blob/v2.0.85/rembg/commands/s_command.py)

素材：照片样式输入由 apizt 原创生成；几何商品、积木、文具、纹理、线稿和透明标尺由代码原创绘制。输入/标注/官方示例均不是未运行模型的输出。
官方代码/模型、第三方依赖各保留其独立许可；包内不含模型权重或API凭证。
