Skip to content

Commit c7aa802

Browse files
committed
feat: add kling image to image
1 parent 160ccf9 commit c7aa802

File tree

2 files changed

+263
-0
lines changed

2 files changed

+263
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
---
2+
title: 可灵 Kling 图生图
3+
gitChangelog: false
4+
updatedAt: 2025-05-08
5+
---
6+
7+
# 可灵 Kling 图生图
8+
9+
这是一个图生图的示例,使用 kling 生成图像。
10+
11+
> [!TIP]
12+
> 图像生成是计算密集型任务,特别是高质量、高分辨率图像可能需要数十秒甚至数分钟处理时间,为了让用户发送请求后可以立即收到响应(任务ID),而不必等待整个生成过程,因此用户可以同时提交多个生成任务,然后异步查询结果。
13+
> 同时这样的队列系统允许服务提供商根据可用GPU/TPU资源智能调度任务。
14+
15+
通常来说,图像生成的常见流程是:
16+
17+
1. `POST`: 调用 `生成图像api` 提交图像生成任务,返回获取 `task_id`
18+
2. `GET`: 根据 `task_id` 调用 `查询图像api` 查看图像生成任务是否完成。
19+
20+
本示例实现了每隔一秒轮询任务状态,直到任务完成,然后返回图像 url 列表。
21+
22+
## 代码示例
23+
24+
> 深色背景为可以修改的参数,非必选参数已经注释,可以按照自己的需求启用。
25+
26+
27+
<<< @/zh/snippets/kling-image-to-image.py{164-165,172-182}
28+
29+
30+
## 返回结果
31+
32+
返回结果为图片的 url 列表,这里使用参数 `n=2` 生成两张图片,每个 url 有效期一般为 30 天,推荐尽快下载或者转存。
33+
34+
```
35+
['https://cdn.klingai.com/bs2/upload-kling-api/6567899185/image/CjikY2gHPbcAAAAABUWVOA-0_raw_image_1.png', 'https://cdn.klingai.com/bs2/upload-kling-api/6567899185/image/CjikY2gHPbcAAAAABUWVOA-1_raw_image_1.png']
36+
```
37+
38+
![](https://cdn.jsdelivr.net/gh/timerring/scratchpad2023/2024/2025-05-11-20-37-04.png)
39+
40+
![](https://cdn.jsdelivr.net/gh/timerring/scratchpad2023/2024/2025-05-11-20-37-16.png)
41+
42+
## 流程图
43+
44+
```mermaid
45+
flowchart TD
46+
A[开始] --> B[初始化 KlingImageToImage 实例]
47+
B --> C[调用 generate_image 方法]
48+
49+
subgraph "图像处理"
50+
C --> D{检查图像来源}
51+
D -->|URL| E[直接使用URL]
52+
D -->|本地文件| F[转换为base64]
53+
end
54+
55+
subgraph "API请求与任务等待"
56+
E --> G[调用 _kling_generate_image 方法]
57+
F --> G
58+
G --> H[构建API请求体]
59+
H --> I[发送POST请求]
60+
I --> J{检查响应}
61+
J -->|成功| K[获得task_id]
62+
J -->|失败| L[抛出异常]
63+
64+
K --> M[开始轮询任务状态]
65+
M --> N[调用 _query_kling_image_url 方法]
66+
N --> O[发送GET请求]
67+
O --> P{检查任务状态}
68+
P -->|进行中| Q[等待1秒]
69+
Q --> N
70+
P -->|超时| R[返回None]
71+
P -->|完成| S[获取所有图像URL]
72+
end
73+
74+
S --> T[返回图像URL列表]
75+
R --> U[结束]
76+
L --> U
77+
T --> U
78+
```
+185
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
import http.client
2+
import json
3+
import base64
4+
import time
5+
6+
class KlingImageToImage:
7+
def __init__(self, api_token, api_url):
8+
"""初始化 Kling 图生图转换器
9+
10+
参数:
11+
api_token: API 密钥
12+
api_url: API 节点地址
13+
"""
14+
self.api_url = api_url
15+
self.api_token = api_token
16+
# 初始化 HTTP 连接
17+
self.conn = http.client.HTTPSConnection(self.api_url)
18+
# 设置请求头
19+
self.headers = {
20+
'Authorization': f'Bearer {self.api_token}',
21+
'Content-Type': 'application/json'
22+
}
23+
24+
@staticmethod
25+
def get_image_base64(image_path):
26+
"""将图片转换为 base64 编码形式
27+
28+
参数:
29+
image_path: 图片路径
30+
返回:
31+
base64 编码后的图片字符串
32+
"""
33+
with open(image_path, "rb") as image_file:
34+
return base64.b64encode(image_file.read()).decode("utf-8")
35+
36+
def _kling_generate_image(self, model_name, prompt, image, image_reference,
37+
image_fidelity=0.5, human_fidelity=0.5,
38+
output_format="png", n=1, aspect_ratio="16:9", callback_url=""):
39+
"""使用 kling 进行图生图
40+
41+
参数:
42+
model_name: str, 模型名称,可选择 kling-v1-5 或 kling-v1
43+
prompt: str, 文本提示词
44+
image: str, 参考图片,base64编码或URL
45+
image_reference: str, 参考图片类型,可选值:subject(角色特征参考), face(人物长相参考)
46+
image_fidelity: float, 参考图片强度,取值范围:[0,1],数值越大参考强度越大
47+
human_fidelity: float, 面部参考强度,取值范围:[0,1],数值越大参考强度越大
48+
output_format: str, 输出格式:png 或 jpg
49+
n: int, 生成数量 [1, 9]
50+
aspect_ratio: str, 输出比例:16:9, 9:16, 1:1, 4:3, 3:4, 3:2, 2:3
51+
callback_url: str, 回调地址,可以用于 webhook 等通知场景
52+
返回:
53+
task_id: 生成任务的 id
54+
"""
55+
# 构建请求体,请求的核心参数
56+
payload = {
57+
"model_name": model_name,
58+
"prompt": prompt,
59+
"image": image,
60+
"image_reference": image_reference,
61+
"image_fidelity": image_fidelity,
62+
"human_fidelity": human_fidelity,
63+
"output_format": output_format,
64+
"n": n,
65+
"aspect_ratio": aspect_ratio,
66+
"callback_url": callback_url
67+
}
68+
69+
# 发送 POST 请求,提交图像生成任务
70+
self.conn.request("POST", "/kling/v1/images/generations", json.dumps(payload), self.headers)
71+
# 获取响应
72+
res = self.conn.getresponse()
73+
# 读取响应内容并解析为 JSON
74+
json_data = json.loads(res.read().decode("utf-8"))
75+
# print(json_data)
76+
if 'code' in json_data and json_data['code'] == 0:
77+
# 成功则返回提交的任务 id
78+
return json_data['data']['task_id']
79+
else:
80+
# 失败则返回错误信息
81+
raise Exception(f"API调用失败:{json_data['message']}")
82+
83+
def _query_kling_image_url(self, task_id):
84+
"""使用查询接口获取生成图像 url
85+
86+
参数:
87+
task_id: 生成任务的 id
88+
返回:
89+
image_url: 图像 url,任务未完成时返回 None
90+
"""
91+
# 构建查询路径
92+
query_path = f"/kling/v1/images/generations/{task_id}"
93+
94+
# 发送 GET 请求,查询图像生成任务状态
95+
self.conn.request("GET", query_path, None, self.headers)
96+
# 获取响应
97+
res = self.conn.getresponse()
98+
# 读取响应内容并解析为 JSON
99+
json_data = json.loads(res.read().decode("utf-8"))
100+
# 如果任务状态为成功,则返回图像 url
101+
if json_data['data']['task_status'] == "succeed":
102+
image_urls = [image['url'] for image in json_data['data']['task_result']['images']]
103+
return image_urls
104+
else:
105+
return None
106+
107+
def generate_image(self, model_name, prompt, image,
108+
image_reference="subject", image_fidelity=0.5, human_fidelity=0.5,
109+
output_format="png", n=1, aspect_ratio="16:9", callback_url="", timeout=120):
110+
"""实现功能,直接根据预设的参数返回生成图像的 url
111+
112+
参数:
113+
model_name: str, 模型名称,可选择 kling-v1-5 或 kling-v1
114+
prompt: str, 文本提示词
115+
image: str, 参考图片的URL或本地文件路径
116+
image_reference: str, 参考图片类型,可选值:subject(角色特征参考), face(人物长相参考)
117+
image_fidelity: float, 参考图片强度,取值范围:[0,1],数值越大参考强度越大
118+
human_fidelity: float, 面部参考强度,取值范围:[0,1],数值越大参考强度越大
119+
output_format: str, 输出格式:png 或 jpg
120+
n: int, 生成数量 [1, 9]
121+
aspect_ratio: str, 输出比例:16:9, 9:16, 1:1, 4:3, 3:4, 3:2, 2:3
122+
callback_url: str, 回调地址,可以用于 webhook 等通知场景
123+
timeout: int, 等待生成完成的超时时间(秒)
124+
返回:
125+
image_url: 图像 url
126+
"""
127+
# 处理图像输入 - 自动判断是URL还是本地文件路径
128+
if image.startswith(('http://', 'https://', 'ftp://')):
129+
# 如果是URL,直接使用
130+
image_data = image
131+
else:
132+
# 否则当作本地文件路径处理,转换为base64
133+
try:
134+
image_data = KlingImageToImage.get_image_base64(image)
135+
except Exception as e:
136+
raise ValueError(f"无法读取图像文件: {str(e)}")
137+
138+
# 调用生成图像 api 提交图像生成任务,返回获取 task_id
139+
task_id = self._kling_generate_image(
140+
model_name, prompt, image_data, image_reference,
141+
image_fidelity, human_fidelity, output_format, n, aspect_ratio, callback_url
142+
)
143+
144+
start_time = time.time()
145+
146+
# 轮询等待生成完成
147+
while True:
148+
# 根据 task_id 调用查询图像api 查看图像生成任务是否完成
149+
image_url = self._query_kling_image_url(task_id)
150+
# 如果图像生成任务完成,则返回图像 url
151+
if image_url is not None:
152+
return image_url
153+
# 如果轮询超时,则返回 None
154+
if time.time() - start_time > timeout:
155+
print(f"请求达到 {timeout} 秒超时")
156+
return None
157+
# 轮询间隔 1 秒
158+
time.sleep(1)
159+
print(f"等待图像生成,{int(time.time() - start_time)} 秒", flush=True)
160+
161+
162+
# 使用示例
163+
if __name__ == "__main__":
164+
API_URL = "www.dmxapi.cn" # API 节点地址
165+
DMX_API_TOKEN = "sk-XXXXXXXXXXXXXX" # API 密钥
166+
167+
# 创建图生图转换器实例
168+
kling_image_to_image = KlingImageToImage(api_token=DMX_API_TOKEN, api_url=API_URL)
169+
170+
# 生成图像
171+
image_urls = kling_image_to_image.generate_image(
172+
model_name="kling-v1-5", # [必选]模型名称 参数 kling-v1 或者 kling-v1-5 (注意 v2 没有图生图能力)
173+
prompt="请生成这张照片的梵高风格迁移后的图像", # [必选]文本提示词
174+
image="/Users/dmxapi/Desktop/dmxapi.png", # [必选]参考图片路径 参数可以是 图片的URL https://image.jpg 或者 图片的本地路径 即可
175+
image_reference="subject", # [必选]参考图片类型,可选值:subject(角色特征参考), face(人物长相参考)
176+
# image_fidelity=0.5, # 参考图片强度 参数范围 0-1 默认 0.5
177+
# human_fidelity=0.5, # 面部参考强度 参数范围 0-1 默认 0.5
178+
# output_format="png", # 输出格式 参数范围 png 或者 jpg
179+
# n=1, # 生成数量 参数范围 1-9 默认 1
180+
# aspect_ratio="16:9", # 输出比例 参数范围 16:9, 9:16, 1:1, 4:3, 3:4, 3:2, 2:3 默认 16:9
181+
# callback_url="", # 回调地址
182+
# timeout=120 # 等待超时时间
183+
)
184+
185+
print(image_urls)

0 commit comments

Comments
 (0)