Skip to content

图片转模板 · POST /api/image-to-template

上传一张看中的图,拿到一个可复用的模板。以后只填几个字,出来的图跟原图几乎一样。

调这个接口本身就是「我要模板」的意思,所以没有开关参数

填入你的 API Key本站所有示例里的 $MUSEAV_API_KEY 会就地换成它

只存在你自己浏览器的 localStorage 里,不会发给任何人——本站是纯静态页面,没有后端可发。 共用电脑上看完记得点「清除」。

bash
curl -X POST https://manager.museav.top/api/image-to-template \
  -H "X-API-Key: $MUSEAV_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "image_url": "https://.../海报.jpg",
    "variables": ["title","subject","date"],
    "variable_labels": {"subject":"艺人","location":"城市","title":"演出主题"},
    "create_template": true,
    "template": {"zh_name":"暗金演唱会主视觉","slug":"reverse-gala-2026","category":"海报"}
  }'

也可以 multipart 直传:

bash
curl -X POST https://manager.museav.top/api/image-to-template \
  -H "X-API-Key: $MUSEAV_API_KEY" \
  -F file=@海报.jpg -F create_template=true \
  -F 'variable_labels={"subject":"艺人"}'

参数

除图片外都可选。

参数说明
image_url / file要逆向的图,二选一
variables允许出现的变量白名单,可以收窄(只让改标题就传 ["title"])。模型不能发明白名单外的变量
variable_labels变量 → 你自己的业务叫法。只影响 fields[].labelkey 永远是中台通用语义
create_templatetrue = 直接建好模板返回(走异步);不传 = 只回模板草稿,你自己决定建不建
template模板元信息 zh_name / slug / category / domain,缺省由中台生成。slug 全局唯一,撞了显式报错,绝不覆盖已有模板
asynctrue = 强制异步

可用的变量见变量白名单

同步还是异步,别猜

情况行为
create_template 不为 trueasync 不为 true同步,直接返回结果
create_template=trueasync=true异步,返回 {ok, jobId, status:"pending", async:true}

异步是因为加上「文字层逆向 + 建模板 + 原图转存」之后会明显变慢,不让你干等。

要稳就用同步

实测 40 秒内出结果。异步跑在平台的后台通道上, 被中断时代码没有机会写状态,所以中台超过 5 分钟没进展就判 failederror 里会写明是超时兜底,不是模型失败)—— 宁可判死,也不让你轮询一个永远 pending 的任务。

同步返回

json
{
  "ok": true,
  "sculpt": { "subject": "…", "composition": "…", "universe": "…", "light": "…", "print": "…", "texture": "…" },
  "prompt": "…", "prompt_cn": "…", "style_tags": ["…"], "aspect_ratio": "3:4",
  "zh_name": "…", "description": "…", "genre": "…", "ratio": "3:4", "body_md": "…",
  "image_category": "海报",
  "text_layers": [
    { "role": "title", "content": "…", "position": "…", "coords": { "x": 0.15, "y": 0.46 },
      "font_category": "…", "font_weight": 800, "size_ratio": 0.09,
      "color": "#FFFFFF", "treatment": "…", "alignment": "…",
      "is_variable": true, "variable": "title" }
  ],
  "prompt_template": "……主标题「{title}」置于画面左上,极粗黑体,金色金属渐变带黑描边,字号约占画面宽度 9%……",
  "fields": [{ "key": "title", "label": "主标题", "type": "text", "placeholder": "…" }],
  "template": { "id": "…", "slug": "…", "zh_name": "…", "tenant_id": "…" },
  "template_error": null,
  "template_warnings": ["归一化时丢弃/补齐了什么"]
}

fields 符合字段契约,可以直接拿去建模板。

template 只在 create_template=true 时有值。 template_errornull 表示模板没建成,原因在里面。

text_layers 怎么用

图上每一处文字的逆向结果:角色、原文、位置、字体大类、字重、字号占比、颜色、处理效果。

这些特征同时会被写进 prompt_template —— 换了文字还能出同款,靠的就是这段排版描述

坐标是 0~1 的相对值,不是像素

coords 指文字框中心相对画布的比例。0.46 不是 46px。

size_ratio 是字号占画面宽度的比例。

要自己做 Canvas 合成的话,这两个字段直接够用。

为什么 prompt_template 里的位置描述是模糊的

你会看到「画面中部偏上(约 38% 高度处),其上方保留大片空白」 而不是精确坐标 —— 这是刻意留的余地

坐标写太死,模型会贴着数字排版,牺牲构图美感。 要精确控制就别指望提示词,用 Canvas 按 coords 贴字。

同一角色有多处文字时各占一个变量槽位:{subtitle} / {subtitle_2} / {subtitle_3}, 第 1 处保持基名不变。别假设一个角色只对应一处文字。

异步怎么拿结果

bash
# 看进度
curl "https://manager.museav.top/api/jobs?id=<jobId>" -H "X-API-Key: $MUSEAV_API_KEY"

# 拿结果
curl "https://manager.museav.top/api/image-to-template?job_id=<jobId>" -H "X-API-Key: $MUSEAV_API_KEY"

也可以用 GET /api/jobs-stream(SSE 实时推)。

job.steps 依次出现「接收图片 → 解析图片 → 抽取文字层 → 创建模板」。 每步的 statusrunning = 正在做(可以直接拿来渲染「正在解析图片…」)、 ok = 做完、fail = 卡在这一步。任务结束后不会再有 running

结果形状:{"ok":true,"status":"done","result":{ …与同步返回同一个结构… }}

降级口径

新能力绝不拖垮读图本身。

文字层逆向、变量化、建模板任一环节失败,都只是 prompt_templatenull 加上 template_error 写明原因, sculptprompt_cn 照常返回。

建出来的模板自带原图

原图会转存到中台图库,落在 generation_configs[].default_reference_images

之后 POST /api/generate 只传 {template_id, input} 就会自动带上这张原图出图 —— 你不用再把原图找回来传一遍。 (自己传 reference_images 时以你传的为准。)

权限

用租户 Key 或后台登录态调用

发给成员的账户 Key 打不到这个接口。

建模板是往你组织的模板库里添资产,跟出图不是一回事。

相关