
用 Seedream 5.0 Pro Layerize API 把一张图拆成可编辑图层
https://api.evolink.ai/v1/images/generations 发 POST,model 填 doubao-seedream-5.0-pro-layerize,带上恰好一张图片 URL。返回的是任务 ID 而不是图片——这个模型是异步的,耗时约 120 秒。之后轮询 GET /v1/tasks/{task_id},等 status 变成 completed,再从 result_data 里取图层。本文重点讲容易踩坑的地方:三种「指定拆哪些元素」的方式、为什么按张计费让图层数量成为成本的主要变量,以及比普通生成更严格的输入限制。
你会拿到什么
| 产出 | 格式 | 是什么 |
|---|---|---|
| 底图 | 跟随 output_format(默认 jpeg) | 背景,且被拿走的元素下方会自动补全 |
| 图层 1…16 | 恒为带 alpha 通道的 PNG,不受 output_format 影响 | 每层一个元素,其余区域透明 |
值得停一下的是底图。当 Layerize 把标题文字从海报上揭下来时,它不会留一个洞——而是把文字底下原本的内容重建出来。这正是它和「抠图 / 分割蒙版」的本质区别,也是产出能直接丢进设计软件、不用二次修补的原因。
三种指定图层的方式
prompt 是可选的,三种用法各对应一类活。
1. 不传 prompt —— 自动全量拆分
{
"model": "doubao-seedream-5.0-pro-layerize",
"image_urls": ["https://example.com/poster.png"],
"quality": "auto",
"output_format": "jpeg"
}完全不给提示词时,模型自己识别图中所有主要元素——文字块、主体、装饰、背景——逐个拆成独立图层。这是这个模型最主要的用法,一张复杂海报通常能拆出十层以上。
"prompt": "" 会被上游理解成「用户给了一个空提示词」,从而丢掉自动识别的语义。正确做法是请求体里根本没有 prompt 这个键。2. 自然语言 —— 点名要哪些元素
{
"model": "doubao-seedream-5.0-pro-layerize",
"prompt": "把鹦鹉和标题文字拆出来",
"image_urls": ["https://example.com/poster.png"],
"quality": "2K"
}只关心两三个元素、不想为全量拆分买单时用这个。元素是按语义识别的,所以你说「标题文字」就行,不需要知道它在哪个位置。
3. bbox 坐标 —— 精确框定区域
{
"model": "doubao-seedream-5.0-pro-layerize",
"prompt": "标题文字<bbox>179 58 809 197</bbox>, 1 只鹦鹉<bbox>330 274 641 991</bbox>",
"image_urls": ["https://example.com/poster.png"],
"quality": "1.5K"
}<bbox> 标签内是四个数字,用归一化的 0–1000 坐标(不是像素),顺序为 左 上 右 下。当自然语言有歧义时用它——比如同一画面里有两个相似产品,或者有多个文字块、「那个标题」可能指其中任意一个。bounding_box.normalized,再用这些坐标重跑一次,就能拿到你想要的精确切分。异步流程
第一步 —— 提交任务
curl -X POST https://api.evolink.ai/v1/images/generations \
-H "Authorization: Bearer $EVOLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedream-5.0-pro-layerize",
"image_urls": ["https://example.com/poster.png"],
"quality": "auto"
}'返回的是任务句柄,不是图片:
{
"id": "task-unified-1757165031-seedream5prolayerize",
"object": "image.generation.task",
"model": "doubao-seedream-5.0-pro-layerize",
"status": "pending",
"progress": 0,
"type": "image",
"task_info": { "can_cancel": true, "estimated_time": 120 },
"usage": { "billing_rule": "per_call", "credits_reserved": 39.168 }
}credits_reserved:这是按最坏情况预留的预估值,实际扣费按真正产出的图片数量和尺寸结算。第二步 —— 轮询直到完成
curl https://api.evolink.ai/v1/tasks/task-unified-1757165031-seedream5prolayerize \
-H "Authorization: Bearer $EVOLINK_API_KEY"status 会走 pending → processing → completed(或 failed)。按 120 秒左右预算,每 5 秒轮询一次足够。不想轮询就在提交时传 callback_url:仅支持 HTTPS、禁止内网地址、在计费确认后触发,失败最多重试 3 次(间隔 1 秒 / 2 秒 / 4 秒)。第三步 —— 读取图层
result_data 里每一项都带着足以在任意画布上还原构图的元数据:| 字段 | 含义 |
|---|---|
z_index | 叠放次序。0 是底图,图层从 1 开始递增 |
bounding_box.absolute | 在底图像素坐标系中的位置 |
bounding_box.normalized | 同一个框,0–1000 归一化坐标 |
name | 模型生成的名称,例如「绯红金刚鹦鹉」 |
description | 对该元素更长的描述 |
z_index: 0,没有 name 和 bounding_box。按 z_index 排序、把每个图层放到它的 absolute 框位置合成,就能精确还原原图。输入限制比普通生成更严
整条链路里失败最多的就是这一步,因为 Layerize 并不接受普通 Seedream 生成能接受的全部输入。
| 限制 | 取值 |
|---|---|
| 图片数量 | 恰好 1 张。不传或传 2 张及以上都会报错 |
| 格式 | 仅 .png、.jpeg、.jpg——webp 会被拒绝 |
| 文件大小 | ≤ 30MB |
| 总像素 | 总量 262,144 到 36,000,000——512×512 是刚好达标的最小正方形 |
| 宽高比 | 1:16 到 16:1 之间 |
| URL | 必须能被服务端直接访问,或访问即触发直接下载 |
quality 的取值也更窄:图层模式只接受档位 auto、1K、1.5K、2K。传比例(如 16:9)或具体像素(如 2048x2048)会报错。用 auto 时输出跟随原图——原图落在 921,600 到 4,624,220 像素之间就保持原样,低于 1K 则按 1K 输出,高于 2K 则按 2K 输出。计费:数的是输出图片,不是请求次数
EvoLink 上的 Layerize 比 BytePlus 官方价低 20%:
| 项目 | BytePlus 官方价 | EvoLink |
|---|---|---|
| 输入图 | $0.003 | $0.0024 |
| 输出图 低档(≤ 2,610,000 像素) | $0.0225 | $0.018 |
| 输出图 高档(> 2,610,000 像素) | $0.045 | $0.036 |
1K 和 1.5K 同价,都落在低档。档位是逐张判定的,所以 2K 底图按高档计费,而从它上面揭下来的小文字层按低档计费。两个实算例子:
四个会让你翻车的点
- 发
"prompt": ""而不是不发这个键。会直接废掉自动识别——这个模型最好用的能力。 - 以为
output_format: "png"能影响图层。它只管底图。图层恒为带 alpha 的 PNG。 - 把失败当成部分成功来处理。没有部分成功。任一图层失败即整体失败并全额退款,所以重试逻辑要按「全有或全无」来写。
- 让链接过期。24 小时后就没了。在同一个任务里轮询完就立刻下载。
常见问题
最多能拆出多少层?
1 到 16 个图层,加上底图,最多 17 张输出图。不能指定具体数量,由拆分结果决定。
能控制拆哪些元素吗?
<bbox> 标签以归一化 0–1000 坐标精确框定。图层真的是透明 PNG 吗?
output_format 影响。那个参数只管底图。一次调用要多久?
callback_url。某个图层失败了会怎样?
整个请求失败——没有部分成功——并且全额退款。
任何图片都能拆吗?
需要 PNG 或 JPEG、总像素至少 262,144(例如 512×512)、小于 30MB、宽高比在 1:16 到 16:1 之间。webp 会被拒绝,尽管普通生成接受它。


