FLUX 3 Image 怎么做海报?用边界框排版并局部改字
从一张产品海报的版式开始,写出 FLUX 3 边界框、完整请求和局部改字流程,附 Python 代码、离线预检、文字与成品验收方法。
用 FLUX 3 Image 做产品海报,可以先给产品、标题和活动文案分别划定边界框,再把各元素的说明拼进提示词,按照设计时的画幅比例生成。拿到图片后,仍要逐字检查文案和构图,才能把它当成可发布素材。边界框提供的是版式指导,不会把生成模型变成结果完全确定的排版软件。
本文围绕一张原创的 4:5 陶瓷杯海报展开,给出完整布局、可下载的 Python 客户端、单行改字方法以及发布前验收。适合解决这样的实际问题:普通提示词能生成好看的图,但标题总压住产品,或者行动文案小到看不清。
核验范围,2026 年 10 月 7 日:本次核对了官方 API 文档,截取了真实文档界面,并在本地测试请求构造和失败处理。本文没有执行付费 FLUX 生图。海报需求是人工编写的教学样例,下方没有把文档截图或其他图片冒充我们的生图成品,也不据此宣称输出质量经过实测。
1. 先确定海报需求,再打开生成器
下载并解压教程代码包。其中包含 flux_poster.py、另外两个 API 练习以及依赖清单。准备 Python 3.10 或更高版本,使用一个独立目录,进入脚本所在位置后执行:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
Windows PowerShell 的激活命令为 .venv\Scripts\Activate.ps1。真正生图使用 BFL API Key,不能拿 ChatGPT 订阅代替,也不能假定其他供应商的 Key 通用。通过 BFL 官方控制台确认账户权限,并在启用调用前查看当前 BFL 价格。准备请求只发生在本地;生成和后续编辑可能分别计费。
这个虚构需求不包含真实品牌、商品价格或折扣承诺:
| 要先确定的事项 | 本例采用的内容 | 为什么要提前定好 |
|---|---|---|
| 画幅 | 竖版 4:5 | 后改比例会改变布局的相对尺寸 |
| 产品 | 一只赤陶色杯子,把手朝右 | 产品数量和方向有明确验收依据 |
| 标题 | A QUIETER MORNING | 文案较短,给字形留出足够空间 |
| 活动文案 | Autumn collection | 描述虚构系列,不擅自编促销条件 |
| 行动文案 | Explore the range | 与活动说明分开,主次更清楚 |
| 视觉 | 暖米色纸张、深色文字 | 先确定文字对比度要求 |
真实活动应先批准文案、日期和宣传承诺,再交给模型生成。模型不应该替你决定促销条款。如果产品轮廓、法律说明或品牌字体必须完全准确,提前安排用常规编辑软件合成这些素材。仅凭文字生成一只通用杯子,不能证明它还原了某个具体 SKU。
2. 把版式换成边界框坐标
FLUX 的顺序是 [top, left, bottom, right],也就是上、左、下、右,从左上角开始,四个值均为 0–1000 的整数。它不同于许多绘图库先写 x 坐标的矩形格式,很容易填反。横向和纵向分别归一化,所以同一组坐标放到不同画幅上,对应的像素宽高也不同。官方边界框文档。

2026 年 10 月 7 日截取的官方英文文档,用于核对字段格式,不代表一次已完成的生图。原页面。
本例采用以下布局:
| 元素 ID | 边界框 | 对应区域 |
|---|---|---|
| background_1 | [0, 0, 1000, 1000] | 整个画布 |
| headline_1 | [80, 80, 230, 920] | 上方横向展开的标题 |
| product_1 | [290, 220, 720, 780] | 中间产品,给杯柄留空间 |
| offer_1 | [770, 100, 845, 900] | 产品下方的活动文案 |
| cta_1 | [885, 240, 950, 760] | 独立的底部行动文案 |
假设工作画布为 1000 × 1250 像素,产品框换算后就是左 220、上 362.5、右 780、下 900 像素。这只是坐标换算演示,不表示 API 的 1k 参数必然返回这个像素尺寸。实际尺寸应在下载后读取。
从像素转成归一化坐标时,纵向坐标除以图片高度,横向坐标除以图片宽度,再乘以 1000 并四舍五入。检查上边小于下边、左边小于右边,四个数都在范围内。代码包会在构造请求前拒绝没有正面积的框以及重复元素 ID。
文字和产品之间要留出余量。表格上看起来没有重叠,不保证视觉上也分离:字母上伸部分、阴影和杯柄都可能稍微超出预想区域。小字看不清时,应给它更大的区域,而不是不断在提示词里重复强调“清晰”。
3. 构造提示词,先在本地检查请求
这套工作流把布局作为文字放进 prompt,不是另外新增一个 bounding_boxes 请求字段。脚本会把含有 <headline_1> 等元素引用的描述,与一个 JSON 数组连接起来。以下是完整的原创布局输入,英文文案保持原样,便于各语种读者复现同一个例子:
caption = (
"A vertical promotional poster on a warm cream paper background <background_1>. "
"A single terracotta ceramic mug <product_1> is centered below the large headline <headline_1>. "
"One short offer line <offer_1> and a small call to action <cta_1> sit below the mug. "
"Clean studio lighting, calm editorial design, no brand logo, no additional text."
)
rows = [
{"id": "background_1", "bbox": [0, 0, 1000, 1000],
"desc": "Flat warm cream paper with subtle grain."},
{"id": "headline_1", "bbox": [80, 80, 230, 920],
"desc": 'Large dark serif text reading exactly "A QUIETER MORNING".'},
{"id": "product_1", "bbox": [290, 220, 720, 780],
"desc": "One terracotta ceramic mug, three-quarter view, handle on the right, no lettering."},
{"id": "offer_1", "bbox": [770, 100, 845, 900],
"desc": 'Dark readable text reading exactly "Autumn collection".'},
{"id": "cta_1", "bbox": [885, 240, 950, 760],
"desc": 'Small dark text reading exactly "Explore the range".'},
]
不设置 Key,先运行准备模式:
python flux_poster.py --out prepared-poster
预期结果是 prepared-poster/request.json,终端提示没有发送 API 请求。打开文件,核对 aspect_ratio: "4:5"、resolution: "1k"、grounding: false、五个元素 ID 和三段精确文案。JSON 合法,只能证明请求可以序列化,不能证明模型一定会把字拼对。
本例关闭 grounding,是因为虚构需求已经提供了所需内容;这不是对所有任务都关闭它的通用建议。FLUX 3 API 概览记录了端点和选项。第一次调用尽量保持简单,不要同时增加参考图、更换分辨率并重写布局,否则出了问题很难定位是哪项变化导致。
4. 生成图片,保留任务并下载结果
在本地环境中设置 BFL_API_KEY,不要把密钥写进脚本、截图或仓库。然后使用一个新目录:
python flux_poster.py --run --out live-poster
客户端把请求发送到 https://api.bfl.ai/v1/flux-3-image,将返回的任务保存为 job.json,再轮询返回的地址。状态为 Ready 时,下载图片并转换、保存成真正的 PNG 文件 poster.png,同时打印实际像素尺寸。完整网络代码已放进下载包,超时和错误处理没有藏在省略号里。
脚本设置了五分钟的轮询时间预算;正在进行的 HTTP 请求可能让实际结束时间稍晚。本地超时不等于远端生成失败。如果已经有 job.json,可以继续查询同一个任务:
python flux_poster.py --resume --out live-poster
恢复查询不会重新提交生图,但会更新这个任务的最后状态,并在完成时更新图片。需要不可变记录时,先复制已有文件。如果提交本身超时、任务文件尚未保存,应先查供应商控制台,再决定是否发送另一次计费请求。官方结果处理说明介绍了结果获取方式;临时图片链接应及时下载,不能直接当作博客的永久图片地址。
5. 保留布局,只改一行活动文案
练习把 “Autumn collection” 改成 “Weekend collection”。编辑请求将下载的图片作为 ref_image_0。活动文案那一行的 from 和 src_bbox 设为 null,目标框保持不变;其余元素保留来源引用,源框和目标框相同。
先准备编辑请求,不立即发送:
python flux_poster.py --edit live-poster/poster.png --out prepared-edit
确认请求符合预期后,再使用另一个新目录执行:
python flux_poster.py --edit live-poster/poster.png --run --out live-edit
脚本会把源图嵌入请求。如果源图含有私人或未获授权的素材,不要把 request.json 公开。即使输出准备公开发布,输入产品照片的使用权限仍需确认。
保留行表达的是“哪些内容应该不变”,并不能证明其他像素完全没动。把源图和修改后图片以同样大小并排检查,除了改字区域,还要看杯柄、标题、阴影和留白。如果产品也被改了,应拒绝这个版本,或者在常规编辑器里合成已批准的文字。不能因为文案更准确,就接受错误的产品外观。
6. 按发布素材验收,而不只是确认文件存在
把原始需求和以下验收表放在一起:
| 检查项 | 通过条件 | 不通过时怎么处理 |
|---|---|---|
| 文字 | 每个字母、空格和大小写与批准文案一致 | 放大文字区域、调整已批准文案,或单独排字 |
| 产品 | 只有一只杯子、方向正确、没有多余把手或虚构品牌 | 简化画面;需要精确身份时使用有权使用的参考图 |
| 主次 | 先读到标题,产品不被遮挡,行动文案可见 | 调整边界框,而不是继续堆叠风格要求 |
| 局部编辑 | 指定行改变,其他重要内容仍可接受 | 对比前后图,保留已验收的原图作为后续来源 |
| 文件 | 画幅正确、实际尺寸可用、图片能正常解码 | 检查下载文件,不能只看扩展名 |
| 发布内容 | 无未经批准的促销承诺、意外标志或难以辨认的小字 | 修正后再分发 |
既要看原尺寸,也要按读者在信息流中实际看到的大小检查。放大到 200% 时读得清的标题,缩成手机卡片后可能完全看不清。把提示词、源图、模型名、日期和已验收结果放在同一处,下一次活动变体才能从正确版本开始。
不要因为还有更高分辨率可选,就重新生成一张已经合格的草图。先解决版式和文案。如果之后改分辨率,应把新结果视为另一份输出,重新验收;本文没有证明不同生成之间是像素完全一致的放大。预算也应计算尝试和编辑次数,不能只算第一次请求。
常见失败,应该先查哪一项
HTTP 401 通常要先查认证:BFL Key 是否加载在运行 Python 的同一个 shell。HTTP 400 则检查保存的请求,确认选项值受支持、数据格式正确,不要把其他供应商的参数名直接搬过来。遇到 429,先确认账户限制并放慢请求,不要开启紧密循环重试。
元素位置不对时,先查坐标顺序和画幅;小元素没有出现时,扩大区域、减少视觉竞争;活动文案改了但产品也变了时,核对保留行与源图。边界框是模型指导,不是栅格蒙版。任务被阻止或失败时,应保留状态响应并检查原因,不能把它默认为一次成功生成。
海报验收后,下一步可能是处理产品图片或制作视频。产品图背景工作流适合准备源素材,产品图转短视频分镜适合规划运动。它们是不同交付物:一张布局合格的海报,不能替代视频或翻译后活动素材的验收。
常见问题
- FLUX 3 的边界框会裁掉框外内容吗?
- 不会。边界框用于指导位置和大小,不是硬性裁剪蒙版。编辑后既要检查目标区域,也要检查其他重要内容是否发生变化。
- 没有 API Key,能先准备海报请求吗?
- 可以。配套脚本默认只在本地生成 request.json,不发送请求。真正生图需要你有权使用的 BFL 账户、API Key,并按实际规则支付调用费用。


