教程
如何使用 AI 为图片换风格:hiapi API 的图像到图像风格迁移指南
用 AI 给照片换风格——把一张随手拍变成动画帧、棚拍产品图或水彩插画——并不是什么特殊的“风格迁移”端点。它只是一次普通的图像到图像调用:你发送一张源图片和一段指明目标风格的文字指令,模型返回一张新图片。真正决定你得到的是干净的换风格还是半重新生成的,是你如何编写这条指令,而不是某个可调参数。本指南介绍 hiapi 统一 tasks API 上的请求机制、能防止换风格跑偏成新图片的提示词模式,以及如何根据你想要多少创作自由度在两个已验证的图像到图像模型之间做选择。
你需要准备什么
- 一个 hiapi API 密钥——从你的仪表盘获取。它放在每次请求的
Authorization: Bearer sk-...头中。 - 一个可公开访问的源图片 URL。 hiapi 的服务器会自行抓取图片,因此
localhost路径或没有签名 URL 的私有存储桶无法使用。预签名的 S3/R2/GCS URL 是可以的。
下面的每个模型 id 和字段都在发布前针对线上 API 重新验证过,包括一次强制报错探测,以确认当前的枚举值。
为什么换风格需要“保留条款”
本指南中的两个模型都没有提供数字化的强度或力度参数——发送一个(strength: 0.5)会被直接拒绝,报错为 additional properties 'strength' not allowed。风格强度完全由提示词措辞控制,这意味着像 "make this a Studio Ghibli anime frame" 这样的指令只告诉模型要添加什么,却没告诉它什么要保持不变——主体身份、姿势和构图都可能被模型自由重新诠释。
解决方法是在提示词中始终写两个子句:
- 目标风格,以具体的视觉参照来陈述(一种媒介、一个艺术流派、一种特定观感——“anime cel-shading”“1970s film photography”“clean studio product shot on white”),而不是像“cooler”这样含糊的形容词。
- 一个明确的保留条款——点名不能改变的内容:“keep the same subject, pose, and composition”“keep the text and logo unchanged”“keep the camera angle”。
像 "Restyle this photo as a woodblock print. Keep the subject's pose, framing, and the position of every object in the scene." 这样的提示词在同一条指令中给了模型一个目标和一个约束,这是获得换风格而非重新生成的最大杠杆。
最小可用示例:curl
此示例使用 seedream-5.0-pro/image-to-image,它换风格效果很好,且具有严格、完全验证过的 schema:
curl -s -X POST https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer sk-YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedream-5.0-pro/image-to-image",
"input": {
"prompt": "Restyle this portrait as a watercolor painting with visible brush texture and soft bleeding edges. Keep the subject'\''s pose, expression, and framing exactly as in the source.",
"image_urls": ["https://your-bucket.example.com/portrait.jpg"],
"aspect_ratio": "3:4",
"resolution": "2K"
}
}'
aspect_ratio 是必填项,来自固定枚举——目前为 1:1、4:3、3:4、16:9、9:16、2:3、3:2、21:9。此端点没有“匹配源图”选项,因此请选择最接近源图片真实比例的值(竖版照片 → 3:4 或 9:16,而不是 16:9),以避免模型为了适配而给构图加边或裁剪。
成功创建后会在 data.taskId 返回任务 id:
{ "data": { "taskId": "<your-task-id>" } }
轮询直到进入终态:
curl -s https://api.hiapi.ai/v1/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer sk-YOUR_KEY"
data.status 最终为 success(输出在 data.output[0].url)或 fail(详情在 data.error)。
完整 Python 脚本:创建、轮询、下载
仅使用标准库:
import json
import time
import urllib.request
API = "https://api.hiapi.ai/v1/tasks"
KEY = "sk-YOUR_KEY"
def call(url, payload=None):
req = urllib.request.Request(
url,
data=json.dumps(payload).encode() if payload is not None else None,
headers={
"Authorization": f"Bearer {KEY}",
"Content-Type": "application/json",
},
method="POST" if payload is not None else "GET",
)
with urllib.request.urlopen(req) as resp:
return json.load(resp)
# 1. Create the restyle task
create = call(API, {
"model": "seedream-5.0-pro/image-to-image",
"input": {
"prompt": (
"Restyle this street photo as a 1980s film-grain photograph with warm, "
"faded colors. Keep the same subject, pose, and every object in the "
"same position in the frame."
),
"image_urls": ["https://your-bucket.example.com/street.jpg"],
"aspect_ratio": "16:9",
"resolution": "2K",
},
})
task_id = create["data"]["taskId"]
print("task created:", task_id)
# 2. Poll until terminal state
while True:
task = call(f"{API}/{task_id}")["data"]
if task["status"] == "success":
break
if task["status"] == "fail":
err = task.get("error") or {}
raise RuntimeError(f"task failed: {err.get('code')} {err.get('message')}")
time.sleep(5)
# 3. Download immediately -- output URLs expire
image_url = task["output"][0]["url"]
urllib.request.urlretrieve(image_url, "restyled.png")
print("saved restyled.png")
根据你想要的创作自由度选择模型
两个模型都已在线重新验证,且都不接受 strength 参数,但它们在你能多大地控制源图片影响方面有所不同:
seedream-5.0-pro/image-to-image |
grok-imagine-quality/image-to-image |
|
|---|---|---|
| 参考图片 | 1–10 个公开 URL | 1–3 个公开 URL |
resolution |
1K / 2K(大写) |
1k / 2k(小写)——可选 |
| 构图控制 | 固定的 8 值 aspect_ratio 枚举,无自动匹配 |
aspect_ratio: "auto" 跟随输入画面 |
| 最适合 | 精确、单参考图的换风格,且你已知目标比例 | 快速换风格,希望输出继承源图的精确构图而无需自己选择比例 |
如果你的保留条款包含“same framing”,而你又不想手动计算源图片的宽高比,使用 grok-imagine-quality/image-to-image 并设置 aspect_ratio: "auto" 是更直接的路径——将其替换到上面的请求中,image_urls 最多 3 个,resolution 设为小写 2k。
生产环境注意事项
在服务器上优先使用回调而非轮询。 在请求时添加一个 callback 对象,hiapi 会在终态时 POST 一次,而无需你轮询:
{
"model": "seedream-5.0-pro/image-to-image",
"input": { "...": "..." },
"callback": { "url": "https://your-server.example.com/hiapi-hook", "when": "final" }
}
将回调载荷视为信号而非真相来源——从中获取任务 id,并在行动前自行重新获取 GET /v1/tasks/<id>。对于脚本和 notebook,每 5 秒轮询一次即可。
让重试具有幂等性。 创建任务时存储你自己的源图片 → taskId 映射。如果你的进程在轮询中途崩溃,重启后应重新关联存储的 taskId,而不是重新提交——重新提交是第二个计费任务。
你实际会遇到的错误:
401permission_denied——密钥格式错误或缺失。请求头必须严格为Authorization: Bearer sk-...。400INVALID_REQUEST——schema 违规,例如aspect_ratio: value must be one of '1:1', '4:3', ...或additional properties 'strength' not allowed。两个模型的 schema 都很严格——不要跨模型系列套用参数。image_urls must be an array——传入的是裸字符串而非列表,即使只有一张参考图。
相关阅读
- 本指南中主要模型的完整逐字段参考:如何使用 seedream-5.0-pro/image-to-image。
- 可直接复制的换风格提示词及真实前后对比输出:Grok Imagine Quality 图像到图像提示词配方。
- 同一编辑下跨模型输出质量对比:2026 年最佳图像到图像 API。
- 当前每张图片定价:定价页面。
- 完整 API 参考:hiapi 文档。
常见问题
风格迁移有强度或力度滑块吗?
没有。本指南中的两个模型都不接受 strength 字段——发送它会被视为未识别属性而拒绝。风格强度完全通过提示词风格描述的具体和强烈程度来控制。
如何阻止模型改变我主体的姿势或身份? 在提示词中添加明确的保留条款,点名必须保持不变的内容——姿势、表情、构图、物体位置。当约束被明确写出而非暗示时,模型换风格会更保守。
我能自动保留源图片的确切宽高比吗?
在 grok-imagine-quality/image-to-image 上可以——设置 aspect_ratio: "auto"。在 seedream-5.0-pro/image-to-image 上没有自动选项;请从其固定枚举中选择最接近源图片真实比例的值。
我的源图片必须是公开 URL 吗?
它们必须能被 hiapi 的服务器通过 HTTPS 抓取。私有存储桶的预签名 URL 可以;localhost 或未认证且不可达的路径不行。
我能从一张照片并行生成多个风格变体吗?
可以——每个变体是一个独立任务。用相同的 image_urls 和不同的风格指令发起多个 POST /v1/tasks 调用,然后分别对每个 taskId 轮询或使用回调。
换风格与修补或对象移除有什么区别? 换风格改变整张图片的渲染方式,同时保持内容不变;修补/对象移除改变特定区域,同时保持渲染风格不变。它们是同一类图像到图像端点上的不同提示词模式——如果你实际需要的是修补和对象移除,请参阅修补和对象移除指南。