FLUX 3 Image 怎么做海报?用边界框排版并局部改字

从一张产品海报的版式开始,写出 FLUX 3 边界框、完整请求和局部改字流程,附 Python 代码、离线预检、文字与成品验收方法。

鼠尾草绿底的线稿封面,浅色卡纸上是一把画刷,配圆形点缀及 FLUX 3 Image 标题。

用 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 坐标的矩形格式,很容易填反。横向和纵向分别归一化,所以同一组坐标放到不同画幅上,对应的像素宽高也不同。官方边界框文档。

BFL 真实英文文档,说明 FLUX 3 的边界框坐标顺序以及生成、编辑时使用的字段。

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,并按实际规则支付调用费用。