# API Docs
## 目录
- [开始之前:开启后端服务](#开始之前开启后端服务)
- [接口功能说明](#接口功能说明)
- [cURL 请求示例](#curl-请求示例)
- [Python 请求示例](#python-请求示例)
- [Python Requests 请求方法](#1️⃣-python-requests-请求方法)
- [Python 脚本请求方法](#2️⃣-python-脚本请求方法)
- [Java 请求示例](#java-请求示例)
- [Javascript 请求示例](#javascript-请求示例)
## 开始之前:开启后端服务
在请求 API 之前,请先运行后端服务
```bash
python delopy_api.py
```
## 接口功能说明
### 1.生成证件照(底透明)
接口名:`idphoto`
`生成证件照`接口的逻辑是发送一张 RGB 图像,输出一张标准证件照和一张高清证件照:
- **高清证件照**:根据`size`的宽高比例制作的证件照,文件名为`output_image_dir`增加`_hd`后缀
- **标准证件照**:尺寸等于`size`,由高清证件照缩放而来,文件名为`output_image_dir`
需要注意的是,生成的两张照片都是透明的(RGBA 四通道图像),要生成完整的证件照,还需要下面的`添加背景色`接口。
> 问:为什么这么设计?
> 答:因为在实际产品中,经常用户会频繁切换底色预览效果,直接给透明底图像,由前端 js 代码合成颜色是更好体验的做法。
### 2.添加背景色
接口名:`add_background`
`添加背景色`接口的逻辑是发送一张 RGBA 图像,根据`color`添加背景色,合成一张 JPG 图像。
### 3.生成六寸排版照
接口名:`generate_layout_photos`
`生成六寸排版照`接口的逻辑是发送一张 RGB 图像(一般为添加背景色之后的证件照),根据`size`进行照片排布,然后生成一张六寸排版照。
## cURL 请求示例
cURL 是一个命令行工具,用于使用各种网络协议传输数据。以下是使用 cURL 调用这些 API 的示例。
### 1. 生成证件照(底透明)
```bash
curl -X POST "http://127.0.0.1:8080/idphoto" \
-F "input_image=@demo/images/test.jpg" \
-F "height=413" \
-F "width=295"
```
### 2. 添加背景色
```bash
curl -X POST "http://127.0.0.1:8080/add_background" \
-F "input_image=@test.png" \
-F "color=638cce" \
-F "kb=200"
```
### 3. 生成六寸排版照
```bash
curl -X POST "http://127.0.0.1:8080/generate_layout_photos" \
-F "input_image=@test.jpg" \
-F "height=413" \
-F "width=295" \
-F "kb=200"
```
## Python 请求示例
### 1️⃣ Python Requests 请求方法
#### 1.生成证件照(底透明)
```python
import requests
url = "http://127.0.0.1:8080/idphoto"
input_image_path = "images/test.jpg"
files = {"input_image": open(input_image_path, "rb")}
data = {"height": 413, "width": 295}
response = requests.post(url, files=files, data=data).json()
# response为一个json格式字典,包含status、image_base64_standard和image_base64_hd三项
print(response)
```
#### 2.添加背景色
```python
import requests
url = "http://127.0.0.1:8080/add_background"
input_image_path = "test.png"
files = {"input_image": open(input_image_path, "rb")}
data = {"color": '638cce', 'kb': None}
response = requests.post(url, files=files, data=data).json()
# response为一个json格式字典,包含status和image_base64
print(response)
```
#### 3.生成六寸排版照
```python
import requests
url = "http://127.0.0.1:8080/generate_layout_photos"
input_image_path = "test.jpg"
files = {"input_image": open(input_image_path, "rb")}
data = {"height": 413, "width": 295, "kb": 200}
response = requests.post(url, files=files, data=data).json()
# response为一个json格式字典,包含status和image_base64
print(response)
```
### 2️⃣ Python 脚本请求方法
```bash
python requests_api.py -u -t -i -o [--height ] [--width ] [-c ] [-k ]
```
#### 参数说明
##### 基本参数
- `-u`, `--url`
- **描述**: API 服务的 URL。
- **默认值**: `http://127.0.0.1:8080`
- `-t`, `--type`
- **描述**: 请求 API 的种类,可选值有 `idphoto`、`add_background` 和 `generate_layout_photos`。分别代表证件照制作、透明图加背景和排版照生成。
- **默认值**: `idphoto`
- `-i`, `--input_image_dir`
- **描述**: 输入图像路径。
- **必需**: 是
- **示例**: `./input_images/photo.jpg`
- `-o`, `--output_image_dir`
- **描述**: 保存图像路径。
- **必需**: 是
- **示例**: `./output_images/processed_photo.jpg`
##### 可选参数
- `--height`,
- **描述**: 标准证件照的输出尺寸的高度。
- **默认值**: 413
- `--width`,
- **描述**: 标准证件照的输出尺寸的宽度。
- **默认值**: 295
- `-c`, `--color`
- **描述**: 给透明图增加背景色,格式为 Hex(如#638cce),仅在 type 为`add_background`时生效
- **默认值**: `638cce`
- `-k`, `--kb`
- **描述**: 输出照片的 KB 值,仅在 type 为`add_background`和`generate_layout_photos`时生效,值为 None 时不做设置。
- **默认值**: `None`
- **示例**: `50`
### 1.生成证件照(底透明)
```bash
python requests_api.py \
-u http://127.0.0.1:8080 \
-t idphoto \
-i ./photo.jpg \
-o ./idphoto.png \
--height 413 \
--width 295
```
### 2.添加背景色
```bash
python requests_api.py \
-u http://127.0.0.1:8080 \
-t add_background \
-i ./idphoto.png \
-o ./idphoto_with_background.jpg \
-c 638cce \
-k 50
```
### 3.生成六寸排版照
```bash
python requests_api.py \
-u http://127.0.0.1:8080 \
-t generate_layout_photos \
-i ./idphoto_with_background.jpg \
-o ./layout_photo.jpg \
--height 413 \
--width 295 \
-k 200
```
### 请求失败的情况
- 照片中检测到的人脸大于 1,则失败
## Java 请求示例
### 添加 maven 依赖
```java
cn.hutool
hutool-all
5.8.16
commons-io
commons-io
2.6
```
### 运行代码
#### 1.生成证件照(底透明)
```java
/**
* 生成证件照(底透明) /idphoto 接口
* @param inputImageDir 文件地址
* @return
* @throws IOException
*/
public static String requestIdPhoto(String inputImageDir) throws IOException {
String url = BASE_URL+"/idphoto";
// 创建文件对象
File inputFile = new File(inputImageDir);
Map paramMap=new HashMap<>();
paramMap.put("input_image",inputFile);
paramMap.put("height","413");
paramMap.put("width","295");
//包含status、image_base64_standard和image_base64_hd三项
return HttpUtil.post(url, paramMap);
}
```
#### 2.添加背景色
```java
/**
* 添加背景色 /add_background 接口
* @param inputImageDir 文件地址
* @return
* @throws IOException
*/
public static String requestAddBackground(String inputImageDir) throws IOException {
String url = BASE_URL+"/add_background";
// 创建文件对象
File inputFile = new File(inputImageDir);
Map paramMap=new HashMap<>();
paramMap.put("input_image",inputFile);
paramMap.put("color","638cce");
paramMap.put("kb","200");
// response为一个json格式字典,包含status和image_base64
return HttpUtil.post(url, paramMap);
}
```
#### 3.生成六寸排版照
```java
/**
* 生成六寸排版照 /generate_layout_photos 接口
* @param inputImageDir 文件地址
* @return
* @throws IOException
*/
public static String requestGenerateLayoutPhotos(String inputImageDir) throws IOException {
String url = BASE_URL+"/generate_layout_photos";
// 创建文件对象
File inputFile = new File(inputImageDir);
Map paramMap=new HashMap<>();
paramMap.put("input_image",inputFile);
paramMap.put("height","413");
paramMap.put("width","295");
paramMap.put("kb","200");
//response为一个json格式字典,包含status和image_base64
return HttpUtil.post(url, paramMap);
}
```
#### 4.汇总
```java
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.apache.commons.io.FileUtils;
import org.springframework.util.StringUtils;
import java.io.File;
import java.io.IOException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
/**
* @author: qingshuang
* @createDate: 2024/09/05
* @description: java生成证件照,测试用例
*/
public class Test {
/**
* 接口地址
*/
private final static String BASE_URL = "http://127.0.0.1:8080";
/**
* 生成证件照(底透明) /idphoto 接口
* @param inputImageDir 文件地址
* @return
* @throws IOException
*/
public static String requestIdPhoto(String inputImageDir) throws IOException {
String url = BASE_URL+"/idphoto";
// 创建文件对象
File inputFile = new File(inputImageDir);
Map paramMap=new HashMap<>();
paramMap.put("input_image",inputFile);
paramMap.put("height","413");
paramMap.put("width","295");
return HttpUtil.post(url, paramMap);
}
/**
* 添加背景色 /add_background 接口
* @param inputImageDir 文件地址
* @return
* @throws IOException
*/
public static String requestAddBackground(String inputImageDir) throws IOException {
String url = BASE_URL+"/add_background";
// 创建文件对象
File inputFile = new File(inputImageDir);
Map paramMap=new HashMap<>();
paramMap.put("input_image",inputFile);
paramMap.put("color","638cce");
paramMap.put("kb","200");
return HttpUtil.post(url, paramMap);
}
/**
* 生成六寸排版照 /generate_layout_photos 接口
* @param inputImageDir 文件地址
* @return
* @throws IOException
*/
public static String requestGenerateLayoutPhotos(String inputImageDir) throws IOException {
String url = BASE_URL+"/generate_layout_photos";
// 创建文件对象
File inputFile = new File(inputImageDir);
Map paramMap=new HashMap<>();
paramMap.put("input_image",inputFile);
paramMap.put("height","413");
paramMap.put("width","295");
paramMap.put("kb","200");
return HttpUtil.post(url, paramMap);
}
/**
* 生成证件照(底透明)
* @param inputImageDir 源文件地址
* @param outputImageDir 输出文件地址
* @throws IOException
*/
private static void requestIdPhotoToImage(String inputImageDir, String outputImageDir) throws IOException {
String res =requestIdPhoto(inputImageDir);
//转成json
JSONObject response= JSONUtil.parseObj(res);
if(response.getBool("status")){//请求接口成功
String image_base64_standard= response.getStr("image_base64_standard");
String image_base64_hd =response.getStr("image_base64_hd");
String[] outputImageDirArr= StringUtils.split(outputImageDir,".");
// Base64 保存为图片
FileUtils.writeByteArrayToFile(new File(outputImageDirArr[0]+"_standard."+outputImageDirArr[1]), Base64.getDecoder().decode(image_base64_standard));
FileUtils.writeByteArrayToFile(new File(outputImageDirArr[0]+"_hd."+outputImageDirArr[1]), Base64.getDecoder().decode(image_base64_hd));
}
}
/**
* 添加背景色
* @param inputImageDir 源文件地址
* @param outputImageDir 输出文件地址
* @throws IOException
*/
private static void requestAddBackgroundToImage(String inputImageDir, String outputImageDir) throws IOException {
String res =requestAddBackground(inputImageDir);
//转成json
JSONObject response= JSONUtil.parseObj(res);
if(response.getBool("status")){//请求接口成功
String image_base64= response.getStr("image_base64");
String[] outputImageDirArr= StringUtils.split(outputImageDir,".");
// Base64 保存为图片
FileUtils.writeByteArrayToFile(new File(outputImageDirArr[0]+"_background."+outputImageDirArr[1]), Base64.getDecoder().decode(image_base64));
}
}
/**
* 生成六寸排版照
* @param inputImageDir 源文件地址
* @param outputImageDir 输出文件地址
* @throws IOException
*/
private static void requestGenerateLayoutPhotosToImage(String inputImageDir, String outputImageDir) throws IOException {
String res =requestGenerateLayoutPhotos(inputImageDir);
//转成json
JSONObject response= JSONUtil.parseObj(res);
if(response.getBool("status")){//请求接口成功
String image_base64= response.getStr("image_base64");
String[] outputImageDirArr= StringUtils.split(outputImageDir,".");
// Base64 保存为图片
FileUtils.writeByteArrayToFile(new File(outputImageDirArr[0]+"_layout."+outputImageDirArr[1]), Base64.getDecoder().decode(image_base64));
}
}
public static void main(String[] args) {
try {
//生成证件照(底透明)
requestIdPhotoToImage("C:\\Users\\Administrator\\Desktop\\1111.jpg","C:\\Users\\Administrator\\Desktop\\2222.png");
//添加背景色
requestAddBackgroundToImage("C:\\Users\\Administrator\\Desktop\\2222_hd.png","C:\\Users\\Administrator\\Desktop\\idphoto_with_background.jpg");
//生成六寸排版照
requestGenerateLayoutPhotosToImage("C:\\Users\\Administrator\\Desktop\\1111.jpg","C:\\Users\\Administrator\\Desktop\\2222.png");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
## JavaScript 请求示例
在JavaScript中,我们可以使用`fetch` API来发送HTTP请求。以下是如何使用JavaScript调用这些API的示例。
### 1. 生成证件照(底透明)
```javascript
async function generateIdPhoto(inputImagePath, height, width) {
const url = "http://127.0.0.1:8080/idphoto";
const formData = new FormData();
formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.jpg"));
formData.append("height", height);
formData.append("width", width);
const response = await fetch(url, {
method: 'POST',
body: formData
});
const result = await response.json();
console.log(result);
return result;
}
// 示例调用
generateIdPhoto("images/test.jpg", 413, 295).then(response => {
console.log(response);
});
```
### 2. 添加背景色
```javascript
async function addBackground(inputImagePath, color, kb) {
const url = "http://127.0.0.1:8080/add_background";
const formData = new FormData();
formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.png"));
formData.append("color", color);
formData.append("kb", kb);
const response = await fetch(url, {
method: 'POST',
body: formData
});
const result = await response.json();
console.log(result);
return result;
}
// 示例调用
addBackground("test.png", "638cce", 200).then(response => {
console.log(response);
});
```
### 3. 生成六寸排版照
```javascript
async function generateLayoutPhotos(inputImagePath, height, width, kb) {
const url = "http://127.0.0.1:8080/generate_layout_photos";
const formData = new FormData();
formData.append("input_image", new File([await fetch(inputImagePath).then(res => res.blob())], "test.jpg"));
formData.append("height", height);
formData.append("width", width);
formData.append("kb", kb);
const response = await fetch(url, {
method: 'POST',
body: formData
});
const result = await response.json();
console.log(result);
return result;
}
// 示例调用
generateLayoutPhotos("test.jpg", 413, 295, 200).then(response => {
console.log(response);
});
```