Skip to content

qwen-image-2.1-pro 图生图 API 使用文档 ​

基于 qwen-image-2.1-pro 的图生图(I2I)接口,通过 /v1/images/edits 端点同步调用。传入 1~10 张参考图并配合编辑指令,即可完成风格迁移、元素修改、内容重绘等操作;支持提示词智能改写(DPE)与思考模式,单次可输出 1~6 张图,输出分辨率总像素在 512×512 至 2048×2048 之间、宽高比 1:8 至 8:1 自由设置(不指定 size 时由模型自动推荐分辨率);该模型价格为 0.25 元/张。

接口地址 ​

接口请求方式URL
图生图POSThttps://www.dmxapi.cn/v1/images/edits

WARNING

请妥善保管您的 API Key!严禁将密钥泄露给他人、硬编码到代码中或提交到公开的代码仓库。如果怀疑密钥已泄露,请立即前往 DMXAPI 官网重新生成。

模型名称 ​

  • qwen-image-2.1-pro

图生图 示例代码 ​

python
import base64
import binascii
import os

import requests
import json

# ===============================================================
# 步骤1: 配置 API 连接信息
# ===============================================================

# DMXAPI 服务端点地址
url = "https://www.dmxapi.cn/v1/images/edits"

# DMXAPI 密钥 (请替换为您自己的密钥)
# 获取方式: 登录 DMXAPI 官网 -> 个人中心 -> API 密钥管理
api_key = "sk-***********************************************"

# ===============================================================
# 步骤2: 配置请求头
# ===============================================================

headers = {
    "Content-Type": "application/json",      # 指定请求体为 JSON 格式
    "Authorization": f"{api_key}",           # token 认证方式
}

# ===============================================================
# 步骤3: 配置请求参数
# ===============================================================

payload = {
    # 【model】(string, 必填) 调用的模型名称
    "model": "qwen-image-2.1-pro",

    # 【prompt】(string, 必填) 正向提示词
    # 用于描述您期望编辑后的图像内容、风格和构图,支持中英文
    # 推荐不超过 4500 Token
    "prompt": "图片风格变为美漫风格",

    # 【image】(string 或 array[string], 必填) 输入图像的 URL 或 Base64 编码数据
    # I2I 场景下支持传入 1~10 张图像;单图直接传字符串,多图传数组,数组顺序即图像顺序
    # 图像要求:
    #   - 图像格式: JPG、JPEG、PNG、BMP、TIFF、WEBP 和 GIF
    #   - 图像大小: 单张不超过 10MB
    #   - 图像宽高: 各为 1~8000 像素,长短边比例不超过 10:1
    # 支持的输入格式:
    #   - 公网 URL: 支持 HTTP 和 HTTPS 协议
    #   - Base64 编码: 格式为 data:{MIME_type};base64,{base64_data}
    "image": "https://cdn.jsdelivr.net/gh/opencv/opencv/samples/data/fruits.jpg",

    # 【n】(integer, 可选) 输出图像的数量,支持输出 1~6 张图片,默认值 1
    "n": 1,

    # 【prompt_extend】(bool, 可选) 是否开启提示词智能改写,默认值 True (建议开启)
    # 开启后模型会按照 prompt_extend_mode 指定的方式优化正向提示词
    # 对描述较简单的提示词效果提升明显
    "prompt_extend": True,

    # 【prompt_extend_mode】(string, 可选) 提示词改写方式,默认值 "direct"
    # 可选值:
    #   - "direct" 直接提示词增强(DPE),适用于大多数场景,T2I 和 I2I 均支持
    #   - "agent"  智能体提示词增强(APE),仅支持文生图(T2I)
    # 注意: 本接口为图生图(I2I)场景,传入 "agent" 将返回 400 错误,请保持 "direct"
    "prompt_extend_mode": "direct",

    # 【enable_thinking】(bool, 可选) 是否开启思考模式,默认值 True
    # 开启时模型将增强推理能力以提升出图质量,但会增加生成耗时
    # 仅在 prompt_extend=True 时生效
    "enable_thinking": True,

    # 【watermark】(bool, 可选) 是否添加水印,默认值 False
    "watermark": False,

    # ---------------------------------------------------------------
    # 以下为可选参数,按需取消注释后使用
    # ---------------------------------------------------------------

    # 【size】(string, 可选) 设置输出图像的分辨率,格式为 宽x高,例如 "1024x1024"
    # 未指定或填写 "auto" 时,由模型根据提示词自动推荐分辨率
    # 图生图(I2I): 像素面积范围 512x512 至 2048x2048,宽高比限制 1:8 至 8:1
    # "size": "1024x1024",

    # 【seed】(integer, 可选) 随机数种子,取值范围 [0, 2147483647]
    # 未传入时服务会随机选择种子,固定种子可使生成结果相对稳定
    # "seed": 42,
}

# ===============================================================
# 步骤4: 媒体输入处理(严格按每个参数自己的接口契约)
# ===============================================================
# 本段代码用于把 image 字段统一规整成接口能接受的形式,支持三种写法:
#   - 公网 URL       : 以 http:// 或 https:// 开头,原样透传
#   - Data URI       : data:{MIME_type};base64,{base64_data},校验头部与正文合法性后透传
#   - 本地文件路径   : 自动读取文件、转 Base64,并按扩展名补上 MIME 头拼成 Data URI
# 若您只使用公网图片 URL,本段可以整体删除,不影响调用。
#
# - payload["image"](图片)
#   限制:支持 1–10 张图(单图传字符串,多图传数组)
#   限制:单图不超过 10 MB
#   限制:宽高各为 1–8000 像素,长短边比例不超过 10:1

# 媒体契约表:描述该字段允许哪些输入形式、本地文件如何编码、支持哪些格式
_MEDIA_RULES = {
    "rule_1": {
        "allow_url": True,              # 允许公网 URL
        "allow_data_uri": True,         # 允许 Data URI
        "allow_raw_base64": False,      # 不允许裸 Base64(必须带 data: 头)
        "allow_local_file": True,       # 允许本地文件路径
        "local_encoding": "data_uri",   # 本地文件编码为 Data URI 形式
        # 本地文件扩展名 -> MIME 类型映射
        "file_formats": {
            ".jpg": "image/jpeg",
            ".jpeg": "image/jpeg",
            ".png": "image/png",
            ".bmp": "image/bmp",
            ".tif": "image/tiff",
            ".tiff": "image/tiff",
            ".webp": "image/webp",
            ".gif": "image/gif",
        },
        # Data URI 允许的 MIME 类型白名单
        "data_types": ["image/bmp", "image/gif", "image/jpeg", "image/png", "image/tiff", "image/webp"],
    },
}

def _resolve_media(value: str, rule: dict, field: str) -> tuple:
    """把媒体入参规整为接口可接受的形式,返回 (值, 形式)。形式为 url / data_uri / raw_base64。"""
    if not isinstance(value, str) or not value:
        raise ValueError(f"{field} 必须是非空字符串")

    # 情况一: 公网 URL,直接透传
    if value.startswith(("http://", "https://")):
        if rule["allow_url"]:
            return value, "url"
        raise ValueError(f"{field} 不接受 URL")

    # 情况二: Data URI,校验头部 MIME 与正文 Base64 合法性
    if value.startswith("data:"):
        if not rule["allow_data_uri"]:
            raise ValueError(f"{field} 不接受 Data URI")
        header, sep, encoded = value.partition(",")
        expected = {f"data:{media_type};base64" for media_type in rule["data_types"]}
        if not sep or header not in expected or not encoded:
            raise ValueError(f"{field} 的 Data URI 头无效;允许: {sorted(expected)}")
        try:
            base64.b64decode(encoded, validate=True)
        except (binascii.Error, ValueError):
            raise ValueError(f"{field} 的 Data URI 正文不是合法 Base64")
        return value, "data_uri"

    # 情况三: 本地文件路径,读取后按契约编码
    if os.path.isfile(value):
        if not rule["allow_local_file"]:
            raise ValueError(f"{field} 不接受本地文件")
        ext = os.path.splitext(value)[1].lower()
        if ext not in rule["file_formats"]:
            raise ValueError(f"{field} 不支持本地文件格式 {ext};允许: {sorted(rule['file_formats'])}")
        with open(value, "rb") as f:
            encoded = base64.b64encode(f.read()).decode("ascii")
        if rule["local_encoding"] == "raw_base64":
            return encoded, "raw_base64"
        media_type = rule["file_formats"][ext]
        return f"data:{media_type};base64,{encoded}", "data_uri"

    # 情况四: 裸 Base64(仅当契约允许时)
    if rule["allow_raw_base64"]:
        try:
            base64.b64decode(value, validate=True)
            return value, "raw_base64"
        except (binascii.Error, ValueError):
            pass

    raise ValueError(f"{field} 不符合接口媒体契约")

# 就地规整 image 字段(多图数组时对每个元素逐一规整)
if isinstance(payload["image"], list):
    payload["image"] = [_resolve_media(item, _MEDIA_RULES["rule_1"], "payload[\"image\"]")[0] for item in payload["image"]]
else:
    payload["image"] = _resolve_media(payload["image"], _MEDIA_RULES["rule_1"], "payload[\"image\"]")[0]

# ===============================================================
# 步骤5: 发送请求并输出结果
# ===============================================================

# 发送 POST 请求到 API 服务器
response = requests.post(url, headers=headers, json=payload)

# 格式化输出 JSON 响应
# - indent=2: 缩进 2 空格,便于阅读
# - ensure_ascii=False: 正确显示中文字符
print(json.dumps(response.json(), indent=2, ensure_ascii=False))

返回示例 ​

json
{
  "created": 1792396976,
  "data": [
    {
      "url": "https://dashscope-a717.oss-accelerate.aliyuncs.com/1d/9b/20261019/0f854a6a/1ae68e6a-2fd5-9059-845c-78927e15646f_qwen_image3_serving_output_0.png?..."
    }
  ],
  "usage": {
    "height": 1984,
    "image_count": 1,
    "width": 2112
  }
}

© 2026 DMXAPI qwen-image-2.1-pro 图生图

一个 Key 用全球大模型