# API Documentation
## TOC
- [Before You Start: Launch the Backend Service](#before-you-start-launch-the-backend-service)
- [Interface Function Descriptions](#interface-function-descriptions)
- [cURL Request Example](#curl-request-examples)
- [Python Request Example](#python-request-example)
- [Python Requests Method](#1️⃣-python-requests-method)
- [Python Script Method](#2️⃣-python-script-request-method)
- [Java Request Example](#java-request-example)
- [Javascript Request Example](#javascript-request-examples)
## Before You Start: Launch the Backend Service
Before making API requests, please run the backend service:
```bash
python deploy_api.py
```
## Interface Function Descriptions
### 1. Generate ID Photo (Transparent Background)
Interface Name: `idphoto`
The `Generate ID Photo` interface logic involves sending an RGB image and receiving a standard ID photo and a high-definition ID photo:
- **High-Definition ID Photo**: An ID photo made according to the aspect ratio of `size`, with the filename being `output_image_dir` appended with `_hd` suffix.
- **Standard ID Photo**: A photo with dimensions equal to `size`, scaled from the high-definition ID photo, with the filename being `output_image_dir`.
It should be noted that both generated photos are transparent (RGBA four-channel images). To produce a complete ID photo, the following `Add Background Color` interface is also required.
> Q: Why is this design used?
> A: In actual products, users often need to frequently switch background colors to preview effects. Providing a transparent background image and allowing the front-end JavaScript code to synthesize the color offers a better user experience.
### 2. Add Background Color
Interface Name: `add_background`
The `Add Background Color` interface logic involves sending an RGBA image, adding a background color based on `color`, and synthesizing a JPG image.
### 3. Generate 6-inch Layout Photo
Interface Name: `generate_layout_photos`
The `Generate 6-inch Layout Photo` interface logic involves sending an RGB image (usually an ID photo after adding a background color), arranging the photos according to `size`, and then generating a 6-inch layout photo.
## cURL Request Examples
cURL is a command-line tool used to transfer data using various network protocols. Below are examples of how to use cURL to call these APIs.
### 1. Generate ID Photo (Transparent Background)
```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. Add Background Color
```bash
curl -X POST "http://127.0.0.1:8080/add_background" \
-F "input_image=@test.png" \
-F "color=638cce" \
-F "kb=200"
```
### 3. Generate Six-Inch Layout Photo
```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 Request Example
### 1️⃣ Python Requests Method
#### 1. Generate ID Photo (Transparent Background)
```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 is a JSON dictionary containing status, image_base64_standard, and image_base64_hd
print(response)
```
#### 2. Add Background Color
```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 is a JSON dictionary containing status and image_base64
print(response)
```
#### 3. Generate 6-inch Layout Photo
```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 is a JSON dictionary containing status and image_base64
print(response)
```
### 2️⃣ Python Script Request Method
```bash
python requests_api.py -u -t -i -o [--height ] [--width ] [-c ] [-k ]
```
#### Parameter Descriptions
##### Basic Parameters
- `-u`, `--url`
- **Description**: The URL of the API service.
- **Default Value**: `http://127.0.0.1:8080`
- `-t`, `--type`
- **Description**: The type of API request, with optional values being `idphoto`, `add_background`, and `generate_layout_photos`. They represent ID photo creation, transparent image background addition, and layout photo generation, respectively.
- **Default Value**: `idphoto`
- `-i`, `--input_image_dir`
- **Description**: The path of the input image.
- **Required**: Yes
- **Example**: `./input_images/photo.jpg`
- `-o`, `--output_image_dir`
- **Description**: The path to save the image.
- **Required**: Yes
- **Example**: `./output_images/processed_photo.jpg`
##### Optional Parameters
- `--height`
- **Description**: The height of the output size for the standard ID photo.
- **Default Value**: 413
- `--width`
- **Description**: The width of the output size for the standard ID photo.
- **Default Value**: 295
- `-c`, `--color`
- **Description**: Adds a background color to the transparent image, in Hex format (e.g., #638cce), only effective when the type is `add_background`.
- **Default Value**: `638cce`
- `-k`, `--kb`
- **Description**: The KB value of the output photo, only effective when the type is `add_background` or `generate_layout_photos`, and no setting is made when the value is None.
- **Default Value**: `None`
- **Example**: `50`
#### 1. Generate ID Photo (Transparent Background)
```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. Add Background Color
```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. Generate 6-inch Layout Photo
```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
```
#### Request Failure Scenarios
- The request fails if more than one face is detected in the photo.
## Java Request Example
### Add Maven Dependency
```java
cn.hutool
hutool-all
5.8.16
commons-io
commons-io
2.6
```
### Running the Code
#### 1. Generate ID Photo (Transparent Background)
```java
/**
* Generate ID Photo (Transparent Background) /idphoto interface
* @param inputImageDir File address
* @return
* @throws IOException
*/
public static String requestIdPhoto(String inputImageDir) throws IOException {
String url = BASE_URL+"/idphoto";
// Create file object
File inputFile = new File(inputImageDir);
Map paramMap=new HashMap<>();
paramMap.put("input_image",inputFile);
paramMap.put("height","413");
paramMap.put("width","295");
// Contains status, image_base64_standard, and image_base64_hd
return HttpUtil.post(url, paramMap);
}
```
#### 2. Add Background Color
```java
/**
* Add Background Color /add_background interface
* @param inputImageDir File address
* @return
* @throws IOException
*/
public static String requestAddBackground(String inputImageDir) throws IOException {
String url = BASE_URL+"/add_background";
// Create file object
File inputFile = new File(inputImageDir);
Map paramMap=new HashMap<>();
paramMap.put("input_image",inputFile);
paramMap.put("color","638cce");
paramMap.put("kb","200");
// Response is a JSON dictionary containing status and image_base64
return HttpUtil.post(url, paramMap);
}
```
#### 3. Generate 6-inch Layout Photo
```java
/**
* Generate 6-inch Layout Photo /generate_layout_photos interface
* @param inputImageDir File address
* @return
* @throws IOException
*/
public static String requestGenerateLayoutPhotos(String inputImageDir) throws IOException {
String url = BASE_URL+"/generate_layout_photos";
// Create file object
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 is a JSON dictionary containing status and image_base64
return HttpUtil.post(url, paramMap);
}
```
#### 4. Summary
```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 generate ID photo, test case
*/
public class Test {
/**
* Interface address
*/
private final static String BASE_URL = "http://127.0.0.1:8080";
/**
* Generate ID Photo (Transparent Background) /idphoto interface
* @param inputImageDir File address
* @return
* @throws IOException
*/
public static String requestIdPhoto(String inputImageDir) throws IOException {
String url = BASE_URL+"/idphoto";
// Create file object
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 Color /add_background interface
* @param inputImageDir File address
* @return
* @throws IOException
*/
public static String requestAddBackground(String inputImageDir) throws IOException {
String url = BASE_URL+"/add_background";
// Create file object
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 6-inch Layout Photo /generate_layout_photos interface
* @param inputImageDir File address
* @return
* @throws IOException
*/
public static String requestGenerateLayoutPhotos(String inputImageDir) throws IOException {
String url = BASE_URL+"/generate_layout_photos";
// Create file object
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);
}
/**
* Generate ID Photo (Transparent Background)
* @param inputImageDir Source file address
* @param outputImageDir Output file address
* @throws IOException
*/
private static void requestIdPhotoToImage(String inputImageDir, String outputImageDir) throws IOException {
String res =requestIdPhoto(inputImageDir);
// Convert to JSON
JSONObject response= JSONUtil.parseObj(res);
if(response.getBool("status")){// Request interface success
String image_base64_standard= response.getStr("image_base64_standard");
String image_base64_hd =response.getStr("image_base64_hd");
String[] outputImageDirArr= StringUtils.split(outputImageDir,".");
// Base64 save as image
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));
}
}
/**
* Add Background Color
* @param inputImageDir Source file address
* @param outputImageDir Output file address
* @throws IOException
*/
private static void requestAddBackgroundToImage(String inputImageDir, String outputImageDir) throws IOException {
String res =requestAddBackground(inputImageDir);
// Convert to JSON
JSONObject response= JSONUtil.parseObj(res);
if(response.getBool("status")){// Request interface success
String image_base64= response.getStr("image_base64");
String[] outputImageDirArr= StringUtils.split(outputImageDir,".");
// Base64 save as image
FileUtils.writeByteArrayToFile(new File(outputImageDirArr[0]+"_background."+outputImageDirArr[1]), Base64.getDecoder().decode(image_base64));
}
}
/**
* Generate 6-inch Layout Photo
* @param inputImageDir Source file address
* @param outputImageDir Output file address
* @throws IOException
*/
private static void requestGenerateLayoutPhotosToImage(String inputImageDir, String outputImageDir) throws IOException {
String res =requestGenerateLayoutPhotos(inputImageDir);
// Convert to JSON
JSONObject response= JSONUtil.parseObj(res);
if(response.getBool("status")){// Request interface success
String image_base64= response.getStr("image_base64");
String[] outputImageDirArr= StringUtils.split(outputImageDir,".");
// Base64 save as image
FileUtils.writeByteArrayToFile(new File(outputImageDirArr[0]+"_layout."+outputImageDirArr[1]), Base64.getDecoder().decode(image_base64));
}
}
public static void main(String[] args) {
try {
// Generate ID Photo (Transparent Background)
requestIdPhotoToImage("C:\\Users\\Administrator\\Desktop\\1111.jpg","C:\\Users\\Administrator\\Desktop\\2222.png");
// Add Background Color
requestAddBackgroundToImage("C:\\Users\\Administrator\\Desktop\\2222_hd.png","C:\\Users\\Administrator\\Desktop\\idphoto_with_background.jpg");
// Generate 6-inch Layout Photo
requestGenerateLayoutPhotosToImage("C:\\Users\\Administrator\\Desktop\\1111.jpg","C:\\Users\\Administrator\\Desktop\\2222.png");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
## JavaScript Request Examples
In JavaScript, we can use the `fetch` API to send HTTP requests. Below are examples of how to call these APIs using JavaScript.
### 1. Generate ID Photo (Transparent Background)
```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;
}
// Example call
generateIdPhoto("images/test.jpg", 413, 295).then(response => {
console.log(response);
});
```
### 2. Add Background Color
```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;
}
// Example call
addBackground("test.png", "638cce", 200).then(response => {
console.log(response);
});
```
### 3. Generate Six-Inch Layout Photo
```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;
}
// Example call
generateLayoutPhotos("test.jpg", 413, 295, 200).then(response => {
console.log(response);
});
```