FLUX 3 Imageでポスターを作る:バウンディングボックスで配置し、文字を部分修正する

商品・見出し・案内文の配置をFLUX 3の座標に変換し、APIリクエストを準備。Pythonサンプルで生成と部分編集を行い、文字と構図を公開前に確認する手順を解説します。

セージグリーンの背景とクリーム色の紙に筆の線画、円の装飾、FLUX 3 Imageのタイトルを配置した表紙

FLUX 3 Imageで販促ポスターを作るには、商品、見出し、案内文にそれぞれバウンディングボックスを割り当て、その説明をプロンプトに加え、設計した縦横比で生成します。その後、文字と構図を確認してから公開用の素材として採用します。ボックスはモデルに配置を伝えるもので、文字組みを必ず指定どおりに再現させる機能ではありません。

このチュートリアルでは、オリジナルの縦横比4:5の陶器マグのポスターを題材に、レイアウト設計、ダウンロードできるPythonクライアント、案内文1行の修正、公開前の確認までを扱います。通常のプロンプトではきれいな画像ができても、見出しが商品に重なったり、行動を促す文言が小さくなったりする場合に使える手順です。

2026年10月7日時点の検証範囲:公式APIドキュメントを確認し、実際のドキュメント画面を撮影したうえで、リクエストの組み立てとエラー処理をローカルでテストしました。本記事のための有料FLUX生成は実行していません。以下の企画は説明用に作成したもので、掲載画像を当方が生成した完成ポスターや出力品質の証拠として扱ってはいません。

1. 生成を始める前に企画を決める

チュートリアルキットをダウンロードします。flux_poster.py、関連する2つの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キーです。ChatGPTの契約や、別事業者でも使えると想定したキーでは代用できません。BFLの公式ダッシュボードで利用環境を用意し、リクエストを有効にする前に現在のBFL料金を確認してください。準備はローカルで行えますが、生成と追加編集にはそれぞれ料金がかかる場合があります。

架空の企画では、実在ブランドや価格、割引の訴求を使いません。

決める項目今回の設定先に決める理由
キャンバス縦長、4:5後から形を変えると配置の比率も変わる
商品テラコッタ色のマグ1個、持ち手は右対象物と向きを明確に確認できる
見出しA QUIETER MORNING文字に十分な面積を割ける短さにする
案内文Autumn collection架空の販促条件を作らず、コレクションを説明する
CTAExplore the range行動を促す文言を案内文と分ける
仕上げ温かみのあるクリーム色の紙、濃色の文字一貫したコントラスト条件を作る

実際のキャンペーンでは、生成前に文言、日付、訴求内容を確定してください。モデルにセールの条件を作らせるべきではありません。商品の輪郭、法定表示、ブランドの書体を厳密に維持する必要があれば、普段の編集ソフトで合成する前提にします。テキストから一般的なマグを生成しても、特定の商品型番を忠実に再現できたことにはなりません。

2. レイアウトを座標に変換する

FLUXの座標順序は[top, left, bottom, right]で、左上を起点とした0〜1000の整数を使います。多くの画像処理ライブラリが使うx座標始まりの矩形と混同しやすい点です。縦横の各軸を個別に正規化するため、同じボックスでも画像の縦横比によってピクセル単位の幅と高さは変わります。BFLのバウンディングボックス仕様で確認できます。

FLUX 3の座標順序と、生成・編集で使うフィールドを示すBFL公式ドキュメントの実画面

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]下部に独立させるCTA

説明用の1000 × 1250ピクセルの作業キャンバスなら、商品ボックスは左220、上362.5、右780、下900ピクセルになります。これは換算例であり、APIの1k設定でこの寸法が返るという意味ではありません。ダウンロード後に実際の画像寸法を確認してください。

ピクセル座標から変換する場合は、縦方向の値を画像の高さ、横方向の値を幅で割り、それぞれ1000倍して丸めます。topがbottom未満、leftがright未満で、4つの値がすべて範囲内にあることを確かめます。キットでは、面積が正でないボックスや重複する要素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".'},
]

キーを設定せず、準備だけ実行します。

python flux_poster.py --out prepared-poster

prepared-poster/request.jsonが作成され、APIリクエストを送信していない旨が表示されれば想定どおりです。ファイルを開き、aspect_ratio: "4:5"、resolution: "1k"、grounding: false、5つのID、3つの正確な文字列を確認します。有効な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に保存して、応答内のURLをポーリングします。成功してReadyになると画像を取得し、実際のPNGとしてposter.pngに保存します。実寸も表示します。通信処理の全体をキットに含めているため、タイムアウトやエラー処理を省略記号の裏に隠してはいません。

スクリプトのポーリング期限は5分です。ただし、開始済みの通信がその期限を過ぎて完了することはあります。ローカルのタイムアウトは、リモートのジョブ失敗を意味しません。job.jsonが残っていれば、同じジョブの確認を再開できます。

python flux_poster.py --resume --out live-poster

再開時には新たな生成を送信しません。そのジョブの最終状態を更新し、準備できていれば画像を保存します。不変の記録が必要なら再開前にコピーを残してください。送信自体がタイムアウトし、ジョブが保存されていない場合は、別の課金対象リクエストを送る前に事業者のダッシュボードを確認します。取得方法は公式の結果取得ガイドにあります。一時的な画像リンクは恒久的なブログ素材URLとして使わず、速やかにダウンロードしてください。

5. 配置を維持しながら案内文を変える

演習では「Autumn collection」を「Weekend collection」に変えます。編集時はダウンロード済み画像をref_image_0として使用します。案内文の行ではfrom: nullと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. 画像ファイルとしてだけでなく、公開素材として検収する

元の企画と並べて、簡単な検収表を使います。

確認項目合格条件不合格の場合
文字文字、空白、大文字・小文字が承認済み文言と一致文字領域を拡大する、承認を得て文言を短くする、別途文字組みする
商品マグ1個、指定の向き、余分な持ち手や架空のブランドがない場面を単純にする。厳密な同一性が必要なら許諾済み参照画像を使う
視線の順序見出しが先に読め、商品が隠れず、CTAが見える競合する装飾指示を増やさずボックスを調整する
編集指定した行が変わり、周囲の重要な内容を許容できる元画像と比較し、採用した元画像を保持する
出力正しい縦横比、用途に足りる実寸、有効な画像ファイルファイル名の拡張子だけで判断せず、取得ファイルを調べる
公開条件根拠のない販促条件、意図しないロゴ、読めない小さな文字がない配信前に修正する

原寸に加え、読者がフィードで見る大きさでも確認します。200%拡大では正しく見える見出しも、モバイルのカードでは読めない場合があります。プロンプト、元画像、モデル名、日付、採用した出力をまとめて保存しておけば、次のキャンペーン用の派生版を承認済みの状態から作れます。

高解像度の設定があるという理由だけで、うまくできた下書きを再生成する必要はありません。先に配置と文言を確定します。後から別の解像度で生成したものは新しい出力として再検収してください。本記事では、生成し直してもピクセル単位で同じ拡大結果になることを確認していません。初回だけでなく、試行と編集も予算に含めます。

よくある失敗と次に確認すること

HTTP 401なら認証を確認し、Pythonを動かすシェルにBFLキーが読み込まれているかを調べます。HTTP 400なら保存したリクエストを開き、未対応のオプション値やデータ形式の誤りを確認します。他事業者のパラメータ名で置き換えないでください。HTTP 429ならアカウントの制限を確認し、短い間隔で繰り返し送信せず、次のリクエストを待ちます。

要素が違う位置に出る場合は、座標の順序と縦横比を先に確認します。小さな要素が消えるなら、その領域を広げ、周りの要素との競合を減らします。案内文だけでなく商品も変わるなら、維持する要素の行と元画像を比較します。ボックスはモデルへの指示であり、厳密な画像マスクではありません。ブロックされたジョブや失敗したジョブは状態応答と理由を残し、成功した生成に混ぜないようにします。

ポスターを採用した後は、商品画像の加工や動画制作へ進むこともあるでしょう。元画像の準備は商品写真の背景を変える手順、動きを付ける企画は商品写真から短い動画を作る絵コンテ(英語)を参照できます。成果物はそれぞれ異なります。ポスターの配置が整っただけで、動画や翻訳したキャンペーンまで検証できたことにはなりません。

よくある質問

FLUX 3のバウンディングボックスは外側を切り抜くマスクですか?
いいえ。配置と大きさを指定する手がかりであり、厳密なクリッピングマスクではありません。編集後は対象領域と周囲の両方を確認してください。
APIキーなしでポスターの準備を進められますか?
はい。配布スクリプトは標準ではリクエストを送らず、request.jsonを作成します。画像生成には利用権限のあるBFLアカウントとAPIキーが必要で、所定の利用料金がかかります。