图像编辑
接口概述
基于输入图片和编辑指令,实现图像编辑能力:支持修改图中文字、增删或移动物体、改变主体动作、迁移图片风格、多图融合。采用 DashScope 多模态生成协议,请求体为 input + parameters 嵌套结构。
按张计费(输出 n 张即 n 倍单价),本次费用可在控制台「费用中心」查看。
接口地址
POST https://test.jw-info.com/v1/images/edits
请求头
| 请求头 | 是否必填 | 说明 |
|---|---|---|
| Content-Type | 是 | application/json |
| Authorization | 是 | Bearer {API_KEY},或 x-api-key |
请求参数
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| model | string | 是 | 模型名称,见「可用模型」 |
| input | object | 是 | 输入信息 |
| input.messages | array | 是 | 消息数组(仅支持单轮,数组内有且仅有 1 个元素) |
| input.messages[].role | string | 是 | 消息角色,固定为 user |
| input.messages[].content | array | 是 | 消息内容数组,包含 1–3 个图片元素和 1 个文本元素 |
| input.messages[].content[].image | string | 条件必填 | 输入图片的 URL 或 Base64 编码,支持 1–3 张,单张不超过 10MB |
| input.messages[].content[].text | string | 条件必填 | 编辑指令,描述期望的编辑效果;支持中英文,上限 800–1300 token(视模型而定) |
| parameters | object | 否 | 生成参数 |
| parameters.size | string | 否 | 输出图片分辨率,格式 宽*高;部分模型不支持自定义 |
| parameters.n | integer | 否 | 输出图片数量:基础版固定 1 张,增强版 1–6 张,默认 1 |
| parameters.negative_prompt | string | 否 | 反向提示词,描述不希望出现的内容,不超过 500 字符 |
| parameters.prompt_extend | boolean | 否 | 是否开启 Prompt 智能改写,默认 true;部分模型不支持 |
| parameters.watermark | boolean | 否 | 是否添加水印,默认 false |
| parameters.seed | integer | 否 | 随机种子,取值 [0, 2147483647] |
简写形式(可选)
除嵌套体之外,也可以把常用字段直接放在顶层,接口会按上表结构处理,两种写法等价、选一种即可:
| 简写参数 | 对应字段 |
|---|---|
| prompt | input.messages[0].content[].text |
| image | input.messages[0].content[].image(字符串或数组,1–3 张) |
| size | parameters.size(写 宽x高 或 宽*高 均可) |
| n / negative_prompt / prompt_extend / watermark / seed | parameters 下的同名字段 |
模型差异
| 特性 | qwen-image-edit | qwen-image-edit-plus | qwen-image-edit-max |
|---|---|---|---|
| 输出图片数 | 固定 1 张 | 1–6 张 | 1–6 张 |
| 自定义分辨率 | 不支持 | 支持,宽高 512–2048 | 支持,宽高 512–2048 |
| Prompt 智能改写 | 不支持 | 支持 | 支持 |
| 指令 token 上限 | 800 | 800 | 1300 |
| 定位 | 基础编辑、多图融合 | 多图输出、自定义分辨率 | 工业设计、几何推理、角色一致性更强 |
分辨率说明
适用于支持自定义分辨率的模型(qwen-image-edit-plus / qwen-image-edit-max):
- 宽和高的取值范围均为 [512, 2048] 像素;
- 默认接近
1024*1024,宽高比与输入图相近; - 指定
size时会调整为最接近的 16 的倍数; - 输出图像格式为 PNG。
推荐分辨率:
| 宽高比 | 推荐分辨率 |
|---|---|
| 1:1 | 1024*1024、1536*1536 |
| 2:3 | 768*1152、1024*1536 |
| 3:2 | 1152*768、1536*1024 |
| 3:4 | 960*1280、1080*1440 |
| 4:3 | 1280*960、1440*1080 |
| 9:16 | 720*1280、1080*1920 |
| 16:9 | 1280*720、1920*1080 |
请求示例
单图编辑:
{
"model": "qwen-image-edit-plus",
"input": {
"messages": [{
"role": "user",
"content": [
{"image": "https://example.com/photo.jpg"},
{"text": "将背景改为星空,保持主体不变"}
]
}]
}
}
多图融合:
{
"model": "qwen-image-edit-max",
"input": {
"messages": [{
"role": "user",
"content": [
{"image": "https://example.com/city.jpg"},
{"image": "https://example.com/cartoon.png"},
{"text": "使用图一的城市照片作为底图,将图二的卡通形象融入城市场景中"}
]
}]
},
"parameters": {"n": 2, "prompt_extend": true}
}
完整请求(含参数):
{
"model": "qwen-image-edit-plus",
"input": {
"messages": [{
"role": "user",
"content": [
{"image": "https://example.com/photo.jpg"},
{"text": "在画面右下角添加一行文字「Hello World」,字体为行楷风格"}
]
}]
},
"parameters": {
"size": "1024*1024",
"n": 1,
"negative_prompt": "低分辨率,模糊,变形",
"prompt_extend": true,
"watermark": false,
"seed": 12345
}
}
Base64 输入方式(data:image/<格式>;base64, 前缀 + 编码内容):
{
"model": "qwen-image-edit",
"input": {
"messages": [{
"role": "user",
"content": [
{"image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD..."},
{"text": "将图片风格转为油画"}
]
}]
}
}
简写形式(等价写法,字段直接放顶层):
{
"model": "qwen-image-edit-plus",
"prompt": "把第二张图的椅子放进第一张图的客厅里",
"image": ["https://example.com/room.png", "https://example.com/chair.png"],
"n": 2
}
响应参数
| 参数 | 类型 | 说明 |
|---|---|---|
| output | object | 输出信息 |
| output.choices | array | 生成结果列表(每张图一个元素) |
| output.choices[].finish_reason | string | 停止原因,固定为 stop |
| output.choices[].message.role | string | 消息角色,固定为 assistant |
| output.choices[].message.content | array | 消息内容数组 |
| output.choices[].message.content[].image | string | 编辑后的图片下载 URL(有效期 24 小时,PNG 格式) |
| usage.image_count | integer | 生成图片数量 |
| usage.width / usage.height | integer | 图片宽度 / 高度(像素) |
| size | string | 图片实际尺寸 |
| request_id | string | 请求唯一标识 |
图片地址有效期以服务返回为准(通常 24 小时),请及时转存;平台不落盘存储文件。
响应示例
编辑成功(单图):
{
"output": {
"choices": [{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": [{"image": "https://example.com/edited.png"}]
}
}]
},
"usage": {"image_count": 1, "width": 1024, "height": 1024},
"size": "1024*1024",
"request_id": "a1b2c3d4-e5f6-7890-abcd-1234567890ab"
}
多图输出:
{
"output": {
"choices": [{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": [
{"image": "https://example.com/edited-1.png"},
{"image": "https://example.com/edited-2.png"}
]
}
}]
},
"usage": {"image_count": 2, "width": 1024, "height": 1024},
"size": "1024*1024",
"request_id": "b2c3d4e5-f6a7-8901-bcde-1234567890ac"
}
错误响应
参数校验不通过时返回参数错误;模型侧报错时接口以 502 返回,detail 里带上模型给出的原始错误正文,便于对照定位。完整状态码与排查建议见「错误码」页。
参数校验错误:
{
"error": {
"message": "model is required",
"type": "invalid_request_error",
"code": "invalid_request_error"
}
}
模型服务返回的错误(形态随模型侧实现而异,常见两种):
{
"error": {
"message": "Invalid API-key provided.",
"type": "invalid_request_error",
"code": "InvalidApiKey"
}
}
{
"request_id": "31f808fd-8eef-9004-xxxxx",
"code": "InvalidApiKey",
"message": "Invalid API-key provided."
}
调用失败记 0 费用,但仍会在控制台留一条失败记录。
代码示例
cURL · 单图编辑:
curl -X POST https://test.jw-info.com/v1/images/edits \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-你的密钥" \
-d '{
"model": "qwen-image-edit-plus",
"input": {
"messages": [{
"role": "user",
"content": [
{"image": "https://example.com/photo.jpg"},
{"text": "将背景改为星空,保持主体不变"}
]
}]
},
"parameters": {
"size": "1024*1024",
"n": 1
}
}'
cURL · 多图融合:
curl -X POST https://test.jw-info.com/v1/images/edits \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-你的密钥" \
-d '{
"model": "qwen-image-edit-max",
"input": {
"messages": [{
"role": "user",
"content": [
{"image": "https://example.com/city.jpg"},
{"image": "https://example.com/cartoon.png"},
{"text": "将卡通形象融入城市场景中"}
]
}]
},
"parameters": {
"n": 1,
"prompt_extend": true
}
}'
Python:
import requests
BASE = "https://test.jw-info.com"
API_KEY = "sk-你的密钥"
payload = {
"model": "qwen-image-edit-plus",
"input": {
"messages": [{
"role": "user",
"content": [
{"image": "https://example.com/photo.jpg"},
{"text": "将背景改为星空,保持主体不变"}
]
}]
},
"parameters": {
"size": "1024*1024",
"n": 1,
"negative_prompt": "低分辨率,模糊,变形",
"prompt_extend": True,
"watermark": False
}
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
response = requests.post(f"{BASE}/v1/images/edits", json=payload, headers=headers)
result = response.json()
if response.status_code == 200:
for choice in result["output"]["choices"]:
for content in choice["message"]["content"]:
print("图片 URL:", content["image"])
print("尺寸:", result.get("size"))
print("用量:", result["usage"])
else:
print("请求失败:", result.get("detail") or result.get("error", {}).get("message", result))
Java(OkHttp):
import okhttp3.*;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ImageEditExample {
private static final String BASE = "https://test.jw-info.com";
private static final String API_KEY = "sk-你的密钥";
private static final OkHttpClient CLIENT = new OkHttpClient();
private static final ObjectMapper MAPPER = new ObjectMapper();
public static void main(String[] args) throws Exception {
String json = """
{
"model": "qwen-image-edit-plus",
"input": {
"messages": [{
"role": "user",
"content": [
{"image": "https://example.com/photo.jpg"},
{"text": "将背景改为星空,保持主体不变"}
]
}]
},
"parameters": {
"size": "1024*1024",
"n": 1
}
}
""";
RequestBody body = RequestBody.create(json, MediaType.parse("application/json"));
Request request = new Request.Builder()
.url(BASE + "/v1/images/edits")
.addHeader("Authorization", "Bearer " + API_KEY)
.post(body)
.build();
try (Response response = CLIENT.newCall(request).execute()) {
String responseBody = response.body().string();
var result = MAPPER.readTree(responseBody);
if (response.isSuccessful()) {
for (var choice : result.get("output").get("choices")) {
for (var content : choice.get("message").get("content")) {
System.out.println("图片 URL: " + content.get("image").asText());
}
}
System.out.println("尺寸: " + result.get("size").asText());
} else {
System.out.println("请求失败: " + result);
}
}
}
}
可用模型
| 模型 ID | 输出数量 | 分辨率 | 定位 |
|---|---|---|---|
| qwen-image-edit | 固定 1 张 | 默认 | 基础编辑、多图融合 |
| qwen-image-edit-plus | 1–6 张 | 512–2048 可调 | 多图输出、自定义分辨率 |
| qwen-image-edit-max | 1–6 张 | 512–2048 可调 | 工业设计、几何推理、角色一致性更强 |
完整模型清单与价格见控制台「模型广场」。