通义万相-通用图像编辑模型支持输入文本指令,实现扩图、去水印、风格迁移、指令编辑、局部重绘、图像修复等多种图像编辑任务。
本文档仅适用于“中国大陆(北京)”地域,需使用“中国大陆(北京)”地域的API Key。
模型概览
效果示例
原图 | 把女孩的头发修改为红色 | 给女孩戴上一副墨镜 | 转换成法国绘本风格 |
更多示例请参见关键能力。
模型与价格
模型名称 | 计费单价 | 限流(主账号与RAM子账号共用) | 免费额度(查看) | |
任务下发接口RPS限制 | 同时处理中任务数量 | |||
wanx2.1-imageedit | 0.14元/张 | 2 | 2 | 500张 |
快速开始
前提条件
在调用前,请获取API Key,再配置API Key到环境变量。如果通过DashScope SDK进行调用,还需要安装SDK。
示例代码
本节演示如何调用通用图像编辑 API 完成一次“局部重绘”任务。
SDK 在底层封装了异步处理逻辑,上层接口表现为同步调用(即单次请求并等待最终结果返回);而 curl 示例则对应两个独立的异步 API 接口:一个用于提交任务,另一个用于查询结果。
Python
本示例支持三种图像输入方式:公网URL、Base64编码、本地文件路径。
请求示例
import base64
import os
from http import HTTPStatus
from dashscope import ImageSynthesis
import mimetypes
"""
环境要求:
dashscope python SDK >= 1.23.8
安装/升级SDK:
pip install -U dashscope
"""
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
api_key = os.getenv("DASHSCOPE_API_KEY")
# --- 辅助函数:用于 Base64 编码 ---
# 格式为 data:{MIME_type};base64,{base64_data}
def encode_file(file_path):
mime_type, _ = mimetypes.guess_type(file_path)
if not mime_type or not mime_type.startswith("image/"):
raise ValueError("不支持或无法识别的图像格式")
with open(file_path, "rb") as image_file:
encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
return f"data:{mime_type};base64,{encoded_string}"
"""
图像输入方式说明:
以下提供了三种图片输入方式,三选一即可
1. 使用公网URL - 适合已有公开可访问的图片
2. 使用本地文件 - 适合本地开发测试
3. 使用Base64编码 - 适合私有图片或需要加密传输的场景
"""
# 【方式一】使用公网图片 URL
mask_image_url = "http://wanx.alicdn.com/material/20250318/description_edit_with_mask_3_mask.png"
base_image_url = "http://wanx.alicdn.com/material/20250318/description_edit_with_mask_3.jpeg"
# 【方式二】使用本地文件(支持绝对路径和相对路径)
# 格式要求:file:// + 文件路径
# 示例(绝对路径):
# mask_image_url = "file://" + "/path/to/your/mask_image.png" # Linux/macOS
# base_image_url = "file://" + "C:/path/to/your/base_image.jpeg" # Windows
# 示例(相对路径):
# mask_image_url = "file://" + "./mask_image.png" # 以实际路径为准
# base_image_url = "file://" + "./base_image.jpeg" # 以实际路径为准
# 【方式三】使用Base64编码的图片
# mask_image_url = encode_file("./mask_image.png") # 以实际路径为准
# base_image_url = encode_file("./base_image.jpeg") # 以实际路径为准
def sample_sync_call_imageedit():
print('please wait...')
rsp = ImageSynthesis.call(api_key=api_key,
model="wanx2.1-imageedit",
function="description_edit_with_mask",
prompt="陶瓷兔子拿着陶瓷小花",
mask_image_url=mask_image_url,
base_image_url=base_image_url,
n=1)
assert rsp.status_code == HTTPStatus.OK
print('response: %s' % rsp)
if rsp.status_code == HTTPStatus.OK:
for result in rsp.output.results:
print("---------------------------")
print(result.url)
else:
print('sync_call Failed, status_code: %s, code: %s, message: %s' %
(rsp.status_code, rsp.code, rsp.message))
if __name__ == '__main__':
sample_sync_call_imageedit()
响应示例
url 有效期24小时,请及时下载图像。
{
"status_code": 200,
"request_id": "dc41682c-4e4a-9010-bc6f-xxxxxx",
"code": null,
"message": "",
"output": {
"task_id": "6e319d88-a07a-420c-9493-xxxxxx",
"task_status": "SUCCEEDED",
"results": [
{
"url": "https://dashscope-result-wlcb-acdr-1.oss-cn-wulanchabu-acdr-1.aliyuncs.com/xxx.png?xxxxxx"
}
],
"submit_time": "2025-05-26 14:58:27.320",
"scheduled_time": "2025-05-26 14:58:27.339",
"end_time": "2025-05-26 14:58:39.170",
"task_metrics": {
"TOTAL": 1,
"SUCCEEDED": 1,
"FAILED": 0
}
},
"usage": {
"image_count": 1
}
}
Java
本示例支持三种图像输入方式:公网URL、Base64编码、本地文件路径。
请求示例
// Copyright (c) Alibaba, Inc. and its affiliates.
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.JsonUtils;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
/**
* 环境要求
* dashscope java SDK >=2.20.9
* 更新maven依赖:
* https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java
*/
public class ImageEditSync {
// 若没有配置环境变量,请用百炼API Key将下行替换为:apiKey="sk-xxx"
static String apiKey = System.getenv("DASHSCOPE_API_KEY");
/**
* 图像输入方式说明:三选一即可
*
* 1. 使用公网URL - 适合已有公开可访问的图片
* 2. 使用本地文件 - 适合本地开发测试
* 3. 使用Base64编码 - 适合私有图片或需要加密传输的场景
*/
//【方式一】公网URL
static String maskImageUrl = "http://wanx.alicdn.com/material/20250318/description_edit_with_mask_3_mask.png";
static String baseImageUrl = "http://wanx.alicdn.com/material/20250318/description_edit_with_mask_3.jpeg";
//【方式二】本地文件路径(file://+绝对路径 or file:///+绝对路径)
// static String maskImageUrl = "file://" + "/your/path/to/mask_image.png"; // Linux/macOS
// static String baseImageUrl = "file:///" + "C:/your/path/to/base_image.png"; // Windows
//【方式三】Base64编码
// static String maskImageUrl = encodeFile("/your/path/to/mask_image.png");
// static String baseImageUrl = encodeFile("/your/path/to/base_image.png");
public static void syncCall() {
// 设置parameters参数
Map<String, Object> parameters = new HashMap<>();
parameters.put("prompt_extend", true);
ImageSynthesisParam param =
ImageSynthesisParam.builder()
.apiKey(apiKey)
.model("wanx2.1-imageedit")
.function(ImageSynthesis.ImageEditFunction.DESCRIPTION_EDIT_WITH_MASK)
.prompt("陶瓷兔子拿着陶瓷小花")
.maskImageUrl(maskImageUrl)
.baseImageUrl(baseImageUrl)
.n(1)
.size("1024*1024")
.parameters(parameters)
.build();
ImageSynthesis imageSynthesis = new ImageSynthesis();
ImageSynthesisResult result = null;
try {
System.out.println("---sync call, please wait a moment----");
result = imageSynthesis.call(param);
} catch (ApiException | NoApiKeyException e){
throw new RuntimeException(e.getMessage());
}
System.out.println(JsonUtils.toJson(result));
}
/**
* 将文件编码为Base64字符串
* @param filePath 文件路径
* @return Base64字符串,格式为 data:{MIME_type};base64,{base64_data}
*/
public static String encodeFile(String filePath) {
Path path = Paths.get(filePath);
if (!Files.exists(path)) {
throw new IllegalArgumentException("文件不存在: " + filePath);
}
// 检测MIME类型
String mimeType = null;
try {
mimeType = Files.probeContentType(path);
} catch (IOException e) {
throw new IllegalArgumentException("无法检测文件类型: " + filePath);
}
if (mimeType == null || !mimeType.startsWith("image/")) {
throw new IllegalArgumentException("不支持或无法识别的图像格式");
}
// 读取文件内容并编码
byte[] fileBytes = null;
try{
fileBytes = Files.readAllBytes(path);
} catch (IOException e) {
throw new IllegalArgumentException("无法读取文件内容: " + filePath);
}
String encodedString = Base64.getEncoder().encodeToString(fileBytes);
return "data:" + mimeType + ";base64," + encodedString;
}
public static void main(String[] args) {
syncCall();
}
}
响应示例
url 有效期24小时,请及时下载图像。
{
"request_id": "bf6c6361-f0fc-949c-9d60-xxxxxx",
"output": {
"task_id": "958db858-153b-4c81-b243-xxxxxx",
"task_status": "SUCCEEDED",
"results": [
{
"url": "https://dashscope-result-wlcb-acdr-1.oss-cn-wulanchabu-acdr-1.aliyuncs.com/xxx.png?xxxxxx"
}
],
"task_metrics": {
"TOTAL": 1,
"SUCCEEDED": 1,
"FAILED": 0
}
},
"usage": {
"image_count": 1
}
}
curl
本示例覆盖了从创建任务、轮询状态到获取并保存结果的全过程。
异步调用必须设置 Header 参数
X-DashScope-Async
为enable
。异步任务的
task_id
查询有效期为 24 小时,过期后任务状态将变为UNKNOWN
。新手建议使用 Postman调用API。
步骤1:发起创建任务请求
该请求会返回一个任务ID(task_id
)。
请求示例
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/image-synthesis' \
--header 'X-DashScope-Async: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "wanx2.1-imageedit",
"input": {
"function": "description_edit_with_mask",
"prompt": "陶瓷兔子拿着陶瓷小花。",
"base_image_url": "http://wanx.alicdn.com/material/20250318/description_edit_with_mask_3.jpeg",
"mask_image_url": "http://wanx.alicdn.com/material/20250318/description_edit_with_mask_3_mask.png"
},
"parameters": {
"n": 1
}
}'
响应示例
{
"output": {
"task_status": "PENDING",
"task_id": "0385dc79-5ff8-4d82-bcb6-xxxxxx"
},
"request_id": "4909100c-7b5a-9f92-bfe5-xxxxxx"
}
步骤2:根据任务ID查询结果
使用上一步获取的 task_id
,通过接口轮询任务状态,直到 task_status
变为 SUCCEEDED 或 FAILED。
请求示例
请将86ecf553-d340-4e21-xxxxxxxxx
替换为真实的task_id。
curl -X GET https://dashscope.aliyuncs.com/api/v1/tasks/86ecf553-d340-4e21-xxxxxxxxx \
--header "Authorization: Bearer $DASHSCOPE_API_KEY"
响应示例
图像URL有效期为24小时,请及时下载图像。
{
"request_id": "eeef0935-02e9-9742-bb55-xxxxxx",
"output": {
"task_id": "a425c46f-dc0a-400f-879e-xxxxxx",
"task_status": "SUCCEEDED",
"submit_time": "2025-02-21 17:56:31.786",
"scheduled_time": "2025-02-21 17:56:31.821",
"end_time": "2025-02-21 17:56:42.530",
"results": [
{
"url": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/aaa.png"
}
],
"task_metrics": {
"TOTAL": 1,
"SUCCEEDED": 1,
"FAILED": 0
}
},
"usage": {
"image_count": 1
}
}
关键能力
通用图像编辑API 通过 function
参数来指定不同的图像编辑功能。所有功能均遵循快速开始的调用方式。
下文以curl调用为例,仅列出各功能专属的 input
和 parameters
JSON 片段,用于说明请求体中需配置的内容。
提示:curl完整请求应包含 model、input、parameters 等顶层字段,具体结构请参考通用图像编辑API参考。
全局风格化
将整张图像迁移至指定的艺术风格。使用场景包括:绘本创作、社交媒体配图(生成符合特定视觉风格的背景或概念图)等。
如何使用:将参数
function
设置为stylization_all
。支持的风格:
法国绘本风格
金箔艺术风格
搭配使用的参数:
parameters.strength
(0.0-1.0, 默认 0.5) 控制修改幅度,值越小越接近原图。提示词技巧:使用“转换成xx风格”的句式,如“转换成法国绘本风格”。
输入图像 | 输出图像 | |
提示词:转换成法国绘本风格 | 提示词:转换成金箔艺术风格 | |
| ||
通过strength控制图像修改幅度
通过parameters.strength
参数来控制图像修改幅度。该参数为可选值,取值范围为[0.0, 1.0],默认值为0.5。值越接近0,则越接近原图效果;值越接近1,对原图的修改幅度越大。
输入提示词:转换成法国绘本风格。
输入图像 | 输出图像 | ||
strength=0.0(最小值) | strength=0.5(默认值) | strength=1.0(最大值) | |
局部风格化
仅对图像的局部区域进行风格迁移。使用场景包括:个性化定制(如人物服装风格化)、广告设计(突出商品)。
如何使用:将参数
function
设置为stylization_local
。支持的风格:中英文对照如下:
冰雕:ice
云朵:cloud
花灯:chinese festive lantern
木板:wooden
青花瓷:blue and white porcelain
毛茸茸:fluffy
毛线:weaving
气球:balloon
提示词技巧:使用“把xx变成xx风格”的句式,如“把房子变成木板风格”。
输入图像 | 输出图像 | |||
| 冰雕 | 云朵 | 花灯 | 木板 |
青花瓷 | 毛茸茸 |
| 气球 |
指令编辑
无需指定区域,仅通过文本指令即可增加或修改图像内容。使用场景包括:为人物添加配饰、更换发色等无需精确定位的简单编辑。
如何使用:将参数
function
设置为description_edit
。搭配使用的参数:
parameters.strength
(0.0-1.0, 默认 0.5) 控制修改幅度,值越小越接近原图。提示词技巧:显式写明“添加”、“修改”这类操作描述。删除操作推荐使用局部重绘。
能力 | 输入图像 | 输出图像 |
添加元素 | 给小猫添加一副墨镜。 | |
修改元素 | 把女孩的头发修改为红色。 |
通过strength控制图像修改幅度
通过parameters.strength
参数来控制图像修改幅度。该参数为可选值,取值范围为[0.0, 1.0],默认值为0.5。值越接近0,则越接近原图效果;值越接近1,对原图的修改幅度越大。
输入提示词:将女孩穿的衣服修改为彩色印花的沙滩衬衣。
输入图像 | 输出图像 | ||
strength=0.0(最小值) | strength=0.5(默认值) | strength=1.0(最大值) | |
局部重绘
通过提供涂抹区域(mask)图像,对指定区域进行增加、修改或删除操作。使用场景包括:换装、替换物体、移除干扰物等需要精确控制范围的编辑。
如何使用:将参数
function
设置为description_edit_with_mask
。涂抹区域要求:需要提供
mask_image_url
,涂抹图像中白色区域为待编辑区域,黑色为保留区域。提示词技巧:显式写明“添加”、“修改”以及描述删除后的内容这类操作描述。
增加/修改:可描述动作(“给小狗添加一顶帽子”)或描述最终结果(“一只戴着帽子的小狗”)。
删除:若删除对象较小,
prompt
可留空 (""
);若删除对象较大,prompt
需描述删除后应出现的背景内容(如“一个透明玻璃花瓶放在桌子上”),而非“删除小熊”。
能力 | 输入图像 | 输入涂抹区域图像 (白色为待编辑区域) | 输出图像 |
增加元素 | 给小狗添加一顶帽子。 提示词也可以写为“一只戴着帽子的小狗”(描述期望的图像内容)。 | ||
修改元素 | 一只陶瓷兔子抱着一朵陶瓷花。 提示词也可以写为“将陶瓷兔子抱着的胡萝卜换做陶瓷花”(描述动作)。 | ||
删除元素 | 一个透明玻璃花瓶放在桌子上。 提示词需要描述删除后的内容,不要写为“删除一只棕色的小熊”。 |
去文字水印
法律风险提示
使用本功能处理受版权保护的图像(如去除他人品牌水印)可能构成侵权行为。请确保您拥有所处理图像的合法使用权,并自行承担所有相关法律责任。
去除图像中的中英文字符或常见水印。使用场景包括:素材二次处理、广告图净化等。
如何使用:将参数
function
设置为remove_watermark
。提示词技巧:可使用通用指令如“去除图像中的文字”,或指定类型如“去除英文文字”。
输入图像 | 输出图像(去除图像中的文字) |
扩图
沿图像的上、下、左、右四个方向按比例扩展画布,并智能填充内容。使用场景包括:调整构图、将竖图扩展为横图以适配不同媒介尺寸。
如何使用:将参数
function
设置为expand
。搭配使用的参数:
parameters
中的top_scale
,bottom_scale
,left_scale
,right_scale
分别控制四个方向的扩展比例(如全部设置为 1.5,表示扩展为原尺寸的 1.5倍)。提示词技巧:描述扩展后期望看到的完整场景内容。
输入图像 | 输出图像 |
图像超分
提升图像清晰度并支持放大,将低分辨率或模糊图像变得清晰。使用场景包括:老照片修复、提升素材分辨率以满足高清打印或展示需求。
如何使用:将参数
function
设置为super_resolution
。搭配使用的参数:
parameters.upscale_factor
(1-4, 默认 1) 控制放大倍数。当值为 1 时,仅提升清晰度而不放大。提示词技巧:可使用“图像超分”或描述图像内容。
输入图像(模糊图像) | 输出图像(清晰图像) |
图像上色
将黑白或灰度图像转换为彩色图像(黑白/灰度 → 彩色)。使用场景包括:历史照片上色、为线稿或灰度图填充颜色。
如何使用:将参数
function
设置为colorization
。提示词技巧:可留空由模型自动上色,或通过提示词指定关键元素的颜色(如“蓝色背景,黄色叶子”)。
输入图像 | 输出图像 |
线稿生图(支持涂鸦作画)
基于输入图像的轮廓(线稿)并结合提示词生成新图像。使用场景包括:建筑概念设计、插画设计、涂鸦作画等。
如何使用:将参数
function
设置为doodle
。搭配使用参数:
parameters.is_sketch
,用来控制模型的生成效果。false
(默认):输入为 RGB 图像,模型会先提取线稿再生成图像(RGB图像 → 线稿 → 新图)。true
:输入为 RGB 图像(如涂鸦或线稿),模型将直接基于此图像生成图像(RGB图像 → 新图)。
提示词技巧:描述期望生成的图像内容,描述越具体,生成效果越好。
能力 | 输入图像 | 输出图像 |
线稿生图 (is_sketch=false) | 北欧极简风格的客厅。 | |
涂鸦作画 (is_sketch=true) | 一颗树,二次元动漫风格。 |
参考卡通形象生图
法律风险提示
使用本功能处理受版权保护的卡通形象可能构成侵权行为。请确保您拥有所参考形象的合法使用权,或使用您原创的形象,并自行承担所有相关法律责任。
如何使用:将参数
function
设置为control_cartoon_feature
。提示词技巧:采用“卡通形象...”的句式,详细描述形象的动作和所处环境。
输入图像 | 输出图像 |
应用于生产环境
最佳实践
异步轮询:采轮询查询异步任务结果时,建议采用合理的轮询策略(如前30秒每3秒一次,之后拉长间隔),避免因过于频繁的请求而触发限流。
参数调优:对于
strength
等影响效果的关键参数,建议在正式上线前进行小范围测试,找到最适合业务场景的数值。图像存储:API 返回的图像 URL 有效期24小时。请及时将生成的图像下载并转存到您自己的持久化存储服务中(如阿里云 OSS)。
风险防范
错误处理:对任务查询结果中的
task_status
进行判断。对于FAILED
状态,应记录code
和message
以便排查。部分错误(如系统超时)可能是瞬时的,可设计重试逻辑。内容安全:API 会对输入和输出内容进行安全审核。若内容不合规,请求将会报错
DataInspectionFailed
错误。
API 参考
关于通义万相-通用图像编辑模型的输入与输出参数,请参见通用图像编辑API参考。
计费与限流
计费规则
计费项:按成功生成的 图像张数 计费,采用按量后付费模式。
计费公式:费用 = 计费单价 × 图像张数。
抵扣顺序:优先消耗免费额度。额度用尽后,默认转为按量付费。
您可开启“免费额度用完即停”功能,以避免免费额度耗尽后产生额外费用。详情请参见免费额度。
失败不计费:模型调用失败或处理错误不产生任何费用,也不消耗免费额度。
免费额度
关于免费额度的领取、查询、使用方法等详情,请参见免费额度。
调用量查询
模型调用完约一小时后,请在模型观测页面,查看调用量、调用次数、成功率等指标。
限流
模型限流规则及常见问题,请参见限流。
错误码
如果模型调用失败并返回报错信息,请参见错误信息进行解决。
常见问题
Q: 为什么我的任务会失败(FAILED)?
A: 任务失败的常见原因包括:
内容审核不通过:输入或生成的图像内容触发了安全策略。
参数错误:请求中的参数不合法,如
function
名称错误、URL 无法访问等。模型内部错误:模型在处理过程中遇到预期外的问题。请检查任务查询响应中的
code
和error
字段,获取具体错误码和信息,以便定位问题。