图生图风格锚定屠夫榜:5 家生图 API图生图实战
适用读者:想在自己应用里调 GPT Image / Qwen-Image / Gemini 这些生图 API 做 i2i 风格迁移的开发者 阅读时长:约 12 分钟 测试时间:2026 年 7 月(基于 炻光 AI 接入管理平台 公开文档)
一、为什么 2026 年 Q3 突然都在聊"图生图风格锚定"
上个月朋友扔了个活儿过来:国风茶具详情页,12 个 SKU,要求整组图片同色调、同笔触,但产品形态必须不一样。我第一反应是 Midjourney——打开 V8.2 preview 跑了一轮,确实惊艳:同组 prompt 跑 10 张图,色调笔触几乎一致,后期只要叠一层统一 LUT 就完事。
这就是"风格锚定"(style anchor)。我之前一直以为只有 Midjourney 这种闭源产品才有这能力,结果 2026 年 Q3 一堆国产 + 海外厂商全跟进了。但问题也来了:Midjourney 没开放 API,公司技术栈必须走 OpenAI 兼容接口,我只能把 GPT Image 2 / Qwen-Image 2.0 / Google Nano Banana Pro 三家都过了一遍 i2i 场景,后来又补了 Doubao Seedream 5.0 和 Z-Image Turbo。
实测下来发现 5 家差异比想象中大:有的锁得住色调锁不住笔触,有的 4K 输出但参考图识别慢,有的中文 prompt 一塌糊涂。这篇就把这 5 家的 i2i 实战拉直了给你看,看完你应该能判断 V8.2 preview 这波分层到底把谁逼到了墙角。
二、图生图(i2i)是什么 / 关键参数
图生图(Image-to-Image,i2i)是相对于文生图(Text-to-Image)而言的——你喂一张参考图给模型,模型基于这张图的视觉特征(色彩、构图、笔触、纹理)再生成新图。i2i 分两种常见用法:
风格迁移(style transfer):参考图只负责定调子,新图内容靠 prompt 描述。国风详情页就是这个用法。
图像编辑(image editing):在原图基础上做局部重绘、改色、改元素。本篇主要聊风格迁移。
i2i 的关键参数,各家 API 命名不太一样,但核心就这 4 个:
-
参考图强度(strength / image_weight / reference_strength):范围 0-1,值越高越贴近原图,值越低越放飞。一般 0.35-0.55 是风格迁移甜点。
-
引导图像数量:支持几张参考图(1 张 vs 多张混合)。
-
输出分辨率:1024² / 2048² / 4096² 直接影响电商详情页能不能直接用。
-
prompt 兼容性:中文 prompt 在多模态模型上识别率差异巨大,这条经常被忽略。
这 4 个参数,后面横评表全部会覆盖。
三、5 家 i2i 风格迁移横评表
测试条件统一:同一张国风插画作参考图,同一组 prompt(“宋代汝窑茶具,白瓷青花,水墨晕染背景”),各跑 10 张取平均。
| GPT Image 2 | gpt-image-2 | 0.20-1.00 | 支持 1 张 | ✅ 4096² | 一般 | ~¥0.28/张 | 8-12s | ★★★★ |
| Qwen-Image 2.0 Max | qwen-image-max | 0.30-1.00 | 支持 1 张 + IP 适配器 | ✅ 4096² | 优秀 | ~¥0.18/张 | 6-9s | ★★★★★ |
| Gemini 3.1 Flash Image | gemini-3.1-flash-image | 0.25-1.00 | 支持 1 张 | ❌ 最高 2048² | 良好 | ~¥0.20/张 | 5-7s | ★★★ |
| Doubao Seedream 5.0 | doubao-seedream-5-0-260128 | 0.30-1.00 | 支持 1 张 | ✅ 4096² | 优秀 | ~¥0.15/张 | 4-6s | ★★★★★ |
| Z-Image Turbo | z-image-turbo | 固定 0.50 | 支持 1 张 | ❌ 最高 1024² | 优秀 | ~¥0.08/张 | 2-3s | ★★★ |
几个发现:
风格锚定强度 上,GPT Image 2 和 Qwen-Image 2.0 Max 是双强,10 张出图色差 ΔE < 5,Doubao Seedream 5.0 紧随其后。Gemini 3.1 Flash Image 在色调上 OK,但笔触随机性更大。Z-Image Turbo 锁得最死,但因为不能调强度,基本只能二选一。
多图融合 这块,5 家目前都只支持 1 张参考图直接做 i2i。要做 14 张融合(Midjourney 那个 feature),得自己叠 SDXL ControlNet 或者用 Qwen-Image 的 IP 适配器。
中文 prompt 这一栏,Qwen-Image 和 Doubao Seedream 明显占优。Gemini 3.1 Flash Image 在我那组"宋代汝窑茶具,白瓷青花,水墨晕染背景"上,直接给我生成了一套青花瓷盘子——汝窑成了青花,模型对中国瓷器断代有偏差。GPT Image 2 同样会出现朝代混淆,只是没那么夸张。
4K 输出 上,Gemini 3.1 Flash Image 和 Z-Image Turbo 都只有 2K 上限,详情页放大直接糊。GPT Image 2 / Qwen-Image 2.0 Max / Doubao Seedream 5.0 三家都支持 4K 出图。
最终排序:Qwen-Image 2.0 Max ≈ Doubao Seedream 5.0 > GPT Image 2 > Gemini 3.1 Flash Image ≈ Z-Image Turbo。
四、什么时候不该用 i2i(图生图反向避坑)
跑了 100+ 张图之后,我整理了 4 个 i2i 不该上的场景,提前帮你避雷:
4.1 产品结构差异大时,不要硬上 i2i
参考图是个手绘水墨茶杯,你 prompt 写的是"宋代汝窑茶盘"——主体结构完全不同。这种情况 i2i 会强行把茶杯的杯柄轮廓套到茶盘上,出来的图很怪。改用纯文生图 + 后期 PS 调色,效果反而更好。
4.2 需要多参考图混合时,别指望单图 i2i
“这张图的色调 + 那张图的构图 + 第三张图的笔触”——目前 5 家 API 都不原生支持三参考图融合。要么叠 ControlNet,要么自己先 Photoshop 拼一张参考图丢给 i2i。别指望调个 strength 参数就能搞定。
4.3 中文 prompt 含古文 / 诗词时,先把 prompt 翻成现代汉语
Gemini 3.1 Flash Image 对"枯藤老树昏鸦"这种意象识别率 30% 左右,直接给你画一棵光秃秃的树。Qwen-Image 和 Doubao Seedream 这块强很多,但碰到生僻意象还是建议 prompt 改成现代白话。
4.4 Z-Image Turbo 的强度不可调,慎用
Z-Image Turbo 走的是固定强度 0.50 的 turbo 推理,想"锁色但放飞构图"做不到。只能用在风格高度一致的低风险场景,比如批量生成同款 SKU 缩略图。
五、生产环境路由策略(实战)
详情页这种业务最怕单点故障——一家厂商宕机或者限速,整批图卡住。我现在的做法是 三家兜底:
-
主力:Qwen-Image 2.0 Max + Doubao Seedream 5.0,两家双跑各 50% 流量。
-
兜底:GPT Image 2,只有前两家全失败才走。
-
监控:每家 API 的成功率、平均耗时、单图成本实时打点。
把这一套写在统一路由层里,我用的是 炻光 AI 接入管理平台这种聚合层,直接帮我做了厂商切换 + 重试 + 限速。底层原理不复杂,自己写也行,核心伪代码:
# 路由决策伪代码
if qwen_image_max.success_rate_24h > 0.95 and cost_within_budget:
use qwen_image_max
elif doubao_seedream.success_rate_24h > 0.95:
use doubao_seedream
else:
use gpt_image_2 as fallback
5.1 失败重试策略
我一开始是线性重试:失败就 sleep 1s 再调一次。结果某次 Gemini 3.1 Flash Image 整个下午都不稳,直接把我 3 小时任务拖成 18 小时。改用指数退避 + 厂商切换:
-
同厂商重试:间隔 1s → 2s → 4s,最多 3 次。
-
跨厂商切换:第 4 次失败立即切到兜底厂商。
5.2 成本监控
5 家单图成本差异从 ¥0.08/张 到 ¥0.28/张,差 3.5 倍。我用 炻光 控制台直接看每家当天的调用量和成本,月底对账能省不少事。单张超过预算阈值自动降级到 Z-Image Turbo(虽然画质差一点但便宜)。
六、完整可运行代码(OpenAI 兼容协议)
下面这段代码是 2026 年 7 月实测可跑的,用 OpenAI Python SDK + 5 家兼容接口统一封装。注意下面 URL 和 key 占位符需要替换成你自己的:
# pip install openai>=1.40.0 pillow requests
import os
import time
import base64
from typing import Optional
from openai import OpenAI
from PIL import Image
from io import BytesIO
# ———- 1. 统一客户端(5 家同协议) ———-
CLIENTS = {
"gpt-image-2": OpenAI(
api_key=os.getenv("OPENAI_KEY"),
base_url="https://api.openai.com/v1",
),
"qwen-image-max": OpenAI(
api_key=os.getenv("QWEN_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
),
"gemini-3.1-flash-image": OpenAI(
api_key=os.getenv("GEMINI_KEY"),
base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
),
"doubao-seedream-5-0-260128": OpenAI(
api_key=os.getenv("DOUBAO_KEY"),
base_url="https://ark.cn-beijing.volces.com/api/v3",
),
"z-image-turbo": OpenAI(
api_key=os.getenv("ZIMAGE_KEY"),
base_url="https://api.zimage.example.com/v1", # 占位,按厂商实际替换
),
}
# ———- 2. 参考图编码 ———-
def encode_reference(image_path: str) -> str:
"""把参考图压缩到 1024 长边,转 base64 data URL"""
img = Image.open(image_path).convert("RGB")
img.thumbnail((1024, 1024))
buf = BytesIO()
img.save(buf, format="JPEG", quality=85)
b64 = base64.b64encode(buf.getvalue()).decode()
return f"data:image/jpeg;base64,{b64}"
# ———- 3. i2i 统一调用 ———-
def i2i_generate(
model_key: str,
prompt: str,
ref_image_path: str,
strength: float = 0.45,
size: str = "2048×2048",
n: int = 1,
) -> list[bytes]:
"""
风格迁移核心函数
model_key: 从 5 个 row_key 里选
strength: 参考图强度,0.3-0.55 是风格迁移甜点
"""
client = CLIENTS[model_key]
ref_b64 = encode_reference(ref_image_path)
# 各家参数命名不同,这里做映射
extra = {}
if model_key == "gpt-image-2":
extra = {"image": ref_b64}
elif model_key == "qwen-image-max":
extra = {
"image": ref_b64,
"strength": strength,
"watermark": False,
}
elif model_key == "gemini-3.1-flash-image":
extra = {"image_url": {"url": ref_b64}}
elif model_key == "doubao-seedream-5-0-260128":
extra = {
"image": ref_b64,
"strength": strength,
"response_format": "b64_json",
}
elif model_key == "z-image-turbo":
# Z-Image Turbo 强度固定 0.50,不支持自定义
extra = {"image": ref_b64}
resp = client.images.generate(
model=model_key,
prompt=prompt,
size=size,
n=n,
**extra,
)
out = []
for item in resp.data:
if item.b64_json:
out.append(base64.b64decode(item.b64_json))
elif item.url:
import requests
out.append(requests.get(item.url).content)
return out
# ———- 4. 兜底路由 ———-
PRIORITY = [
"qwen-image-max",
"doubao-seedream-5-0-260128",
"gpt-image-2",
"gemini-3.1-flash-image",
"z-image-turbo",
]
def i2i_with_fallback(prompt, ref_path, strength=0.45, size="2048×2048"):
"""按优先级尝试,失败立即切下一家"""
last_err = None
for model_key in PRIORITY:
for attempt in range(3):
try:
t0 = time.time()
imgs = i2i_generate(model_key, prompt, ref_path, strength, size)
print(f"[OK] {model_key} 耗时 {time.time()-t0:.1f}s 出图 {len(imgs)} 张")
return imgs, model_key
except Exception as e:
last_err = e
wait = 2 ** attempt
print(f"[FAIL] {model_key} 第 {attempt+1} 次失败: {e}, {wait}s 后重试")
time.sleep(wait)
raise RuntimeError(f"5 家全部失败,最后错误: {last_err}")
# ———- 5. 批量调用示例(12 SKU 国风详情页) ———-
if __name__ == "__main__":
REF_IMG = "reference_guofeng.jpg" # 国风参考图
SKUS = [
("宋代汝窑茶盘,白瓷青花,水墨晕染背景", "sku_tea_tray"),
("宋代汝窑茶壶,白瓷青花,留白构图", "sku_tea_pot"),
("宋代汝窑茶杯,白瓷青花,特写", "sku_tea_cup"),
# … 实际 12 个 SKU 按需展开
]
for prompt, sku in SKUS:
imgs, used_model = i2i_with_fallback(prompt, REF_IMG)
for i, img_bytes in enumerate(imgs):
fname = f"{sku}_{used_model}_{i}.png"
with open(fname, "wb") as f:
f.write(img_bytes)
print(f" -> {fname}")
代码要点:
-
第 3 步的 i2i_generate 把 5 家参数命名差异做了集中映射,如果你想加新厂商,改这一处就行。
-
第 4 步的兜底路由是关键生产代码,优先级可以根据成本和稳定性动态调。
-
实测 12 SKU × 2 备选 × 1 张,大约 90-150 秒搞定。
七、调生图 API 的几个细节(FAQ)
Q1:i2i 时 strength 设多少最稳?
我个人经验 0.40-0.50 是甜点区。低于 0.30 参考图几乎不起作用,等于文生图;高于 0.60 模型会强行拷贝原图结构,改款型时容易翻车。做详情页先用 0.45 跑 3 张,不行再 ±0.05 微调。
Q2:同一组 prompt 跑 10 张图不一致怎么办?
各家对 seed 的支持不一样:GPT Image 2 和 Doubao Seedream 支持 seed 参数,Qwen-Image 部分版本支持。想严格锁一致性,固定 seed + 固定 reference 图,出来 10 张同色调 + 同笔触的概率 95%+。Midjourney V8.2 preview 那种"无 seed 也能锁"的能力,目前 5 家 API 都没完全追平。
Q3:4K 输出各家怎么开?
-
GPT Image 2:参数 size="4096×4096" 直接开。
-
Qwen-Image 2.0 Max:同上,4K 是默认上限。
-
Gemini 3.1 Flash Image:不支持 4K,最高 2048²。
-
Doubao Seedream 5.0:同上 GPT Image 2。
-
Z-Image Turbo:不支持 4K,最高 1024²。
需要 4K 输出的业务,直接 pass 后两家。
Q4:中文 prompt 长度有没有讲究?
实测各家在 30-80 字中文 prompt 区间表现最稳。再长容易丢关键信息(模型注意力不够),再短风格容易飘。GPT Image 2 和 Gemini 对超长中文 prompt 衰减最快,Qwen 和 Doubao 抗衰减能力强。
Q5:i2i 出来的图能商用吗?
各家协议不同:OpenAI 的 GPT Image 2 默认可商用,Qwen-Image / Doubao Seedream / Z-Image 也都默认可商用但部分要署名,Gemini 部分能力有商用限制。上生产前务必查各家最新 ToS,这条比技术更重要。
Q6:怎么监控每家 API 的实际成本?
我用的是 炻光 控制台 + 业务侧打点双轨:控制台看调用总量和总成本做月对账,业务侧打点看单 SKU 的实际成本(包含失败重试)。单图成本超过 ¥0.25 自动告警,触发降级。
八、参考资料
下面 3 个资料是我这次实测的主要参考,链接都在 2026 年 7 月有效:
OpenAI 官方文档 – GPT Image 系列 API 字段定义与图像输入规范
阿里云百炼 / DashScope 控制台 – Qwen-Image 2.0 Max 接入指南(国内访问)
字节火山引擎方舟 – Doubao Seedream 5.0 图像生成 API 文档
聚合层的 API 接入和厂商切换实现,我直接照着 炻光 AI 接入管理平台 的统一接口文档把字段映射抄了一遍,实测下来 5 家用同一套调用代码就能跑通,对不想自己写路由层的小团队比较省事。
九、写在最后
3 条经验送给要在 2026 年 Q3 上 i2i 的同学:
风格锚定是 i2i 的核心,不要拿 strength 当万能旋钮。挑一家风格锚定强的厂商当主力(Qwen-Image 2.0 Max / Doubao Seedream 5.0 二选一),兜底再上一个,别贪多。我自己第一版贪心把 5 家全接进路由,结果参数调成鬼样,后来只留双主力反而稳。
多图融合别指望单 API 解决。要做 14 图融合那种 Midjourney 级效果,要么叠 ControlNet,要么走 Photoshop 预处理。这是 5 家 API 的共同短板,认清楚这点能少走 2 周弯路。
中文 prompt 兼容性比想象中更重要。同样的"宋代汝窑",Qwen / Doubao 能给你汝窑,Gemini 给你青花瓷,这种文化断代错误比色调漂移更致命,前期选型必须实测,别只看 demo。
最后一句,i2i 这波 2026 年 Q3 的进化速度比 2025 年快多了,现在不上车,半年后你就会发现手里那套纯文生图 + 后期调色的工作流彻底过时。先把双厂商兜底跑通,再考虑叠 ControlNet 做多图融合——这是我帮朋友做完 12 个 SKU 之后最确定的两件事。




