このページは、
gpt-image-2 を POST /v1/images/edits 経由で使うローカライズ編集(inpainting)の実践ガイドです。画像 + マスク + prompt をアップロードして行います。完全なパラメータリファレンスとインタラクティブな Playground については、Image Edit API リファレンス をご覧ください。コア原則: Alpha チャンネルが編集領域を定義します
ローカライズされた編集リクエストは、3つの部分で構成されます。視覚的な例
元の画像が 1024×1024 だとします。マスクはハードクロップではありません
GPT Image のマスクは、フォトショップの選択範囲のような絶対的なピクセルレベルの制約ではありません。公式には、マスク編集は引き続き prompt ガイド型編集であり、モデルはマスクを参照として使用しますが、すべてのピクセル境界への厳密な準拠は保証しません。 そのため、次のような現象が見られることがあります。- マスク外の影がわずかに変化する
- オブジェクトのエッジがマスクの外側まで伸びる
- 照明や反射が連動して変化する
- 背景がわずかに再描画される
- マスク境界付近に遷移効果が出る
編集の安定性を高める
「赤いシャツに変えて」とだけ書かず、代わりに次のように書いてください。- マスクは対象オブジェクトのエッジより少し大きめにします
- オブジェクトの中心だけを覆わず、エッジ、影、反射も含めます
- 変えてはいけないものを明示的に指定します
- 編集領域が小さすぎる場合は、マスクを広げます
- 絶対的な保持が必要な場合は、最後に自分でピクセル合成を行います(下記参照)
マスクを使うべきか、使わないべきか? promptのみ編集とのトレードオフ
よくある疑問です:現代のAIは、平易な言葉だけで「指した場所をそのまま編集する」ことがすでにできるのに、なぜわざわざマスクを作るのでしょうか? 確かに、gpt-image-2はマスクなしでも、「テーブルの左側にあるカップを花に置き換えて」と伝えるだけで、たいていは適切な場所を編集します。指示追従性能は強く、気軽な編集なら prompt だけで十分です。ですが、マスクが解決するのは、言語が曖昧な場合、または曖昧ではなくてもまだ十分に信頼できない場合です:
研究結果も同じ方向を示しています。マスクなし(純粋にテキスト駆動)の編集は、精密な空間制御が苦手です。たとえば prompt-to-prompt 系の手法は、フレーム内で物体を空間的に移動させることができませんし、暗黙の編集領域がずれると、「変わるべき部分が変わらず、変わるべきでない部分が変わってしまう」という状態になります。マスクベースの編集は、少しの手軽さと引き換えに、明示的な空間精度を得られます。
一目でわかるファイル要件
複数画像で編集する場合の役割割り当て:
Python の例
cURL の例
画像編集エンドポイントではmultipart/form-data が必要です — 画像とマスクを通常の JSON フィールドとして送信することはできません:
image[] フィールド名を使ってください。
Node.js の例
マスクはどこから来るのか? 5つの一般的な方法
人はしばしばマスクを難しく感じます — 「元の画像と1ピクセル単位で一致していなければならない」と思うからです。ここで重要なのは、マスクをゼロから描くことはほとんどなく、元の画像から導き出すという点です。コードでも、写真編集ソフトでも、Web キャンバスでも、流れは常に「元画像を開く → その上で領域を指定する → 書き出す」です。そのため、寸法の一致は自動的です。方法 1: プログラムで透明マスクを生成する
長方形領域を透明(編集可能)に設定します:(255, 255, 255, 255)= 不透明、保持する領域(0, 0, 0, 0)= 透明、編集可能な領域
方法 2: 写真編集ソフトで手動消去する
透明 PNG をサポートする任意のエディタ(Photoshop、GIMP、Krita、Photopea など)ならマスクを作成できます。要するにやることは1つで、編集したい領域を消去して透明にすることです。Photoshop では:- 元画像のコピーを開きます(元画像そのものを編集すると、寸法の一致が保証されます)
- レイヤーがロックされた「Background」の場合は、ダブルクリックして通常レイヤーに変換します(背景レイヤーは透明をサポートしていません)
- Lasso / Quick Selection / Object Selection ツールで、変更したい領域を選択します
- Delete を押します — 選択範囲が透明なチェッカーボードになります
- 「PNG として書き出し」(透明を有効にする)— これで有効な alpha マスクになります
Layer → Transparency → Add Alpha Channel、選択し、Delete して、PNG として書き出します。
方法 3: Web ブラシキャンバス
AI 写真アプリで見かける「変更したい部分をブラシでなぞる」という操作は、ブラウザ上でリアルタイム生成される alpha マスクにすぎません。これは単一の Canvas API プロパティを中心に構築されています。下の ブラシ式編集の仕組み を参照してください。方法 4: AI セグメンテーションによるワンクリックマスク
ブラッシングでさえ手間に感じるなら、セグメンテーションモデルに任せましょう。Meta のオープンソース SAM (Segment Anything Model) ファミリーが主流の選択肢です:- クリックしてマスク: オブジェクトを1回クリックすると、モデルがピクセル精度の輪郭を返します(髪の毛の先端レベルまで)
- テキストでマスク: SAM 3 は 2025年11月にオープンソース化され、「黄色いタクシーすべて」や「赤いユニフォームを着た選手たち」のようなコンセプトレベルのテキスト prompt を受け取り、一致する各インスタンスのマスクを返します(モデルとコードは
github.com/facebookresearch、概要はai.meta.com) - 被写体 / 背景の分離:
rembgのようなオープンソースツールは、1つのコマンドで被写体を背景から分離します — 背景領域はそのまま「背景だけを変更する」マスクとして使えます
方法 5: 白黒マスクを alpha マスクに変換する
すでに「黒 = 編集、白 = 保持」のマスクがあるなら:アップロード前にマスクを検証する
多くのinvalid_image_file エラーは、ファイルに .png 拡張子が付いていても RGB チャンネルしかなく、アルファチャンネルがないことが原因です。アップロード前にこれを実行してください:
マスクの形状とブラシ式編集の仕組み
マスクはどんな不規則な形でもよい
マスクは本質的にはピクセルごとのビットマップであり、幾何学的な形ではありません。各ピクセルがそれぞれ独自のアルファ値を持ちます。つまり:- 長方形や円は、もっとも単純な例にすぎません
- 人物のシルエット、髪の毛の端、フリーハンドの落書き、あるいは複数に分かれた断片もすべて有効です
- 実際にはほとんどのマスクは不規則で、対象物の輪郭に沿い、少し広げた形になります
ブラシ式編集の実装方法
写真アプリでの「変更したい場所をブラシでなぞる」操作は、フロントエンドでは驚くほど単純です。**2枚のレイヤーを重ね、ブラシで上のレイヤーを透明に「消していく」**だけです。destination-outに設定します(新しいストロークが既存ピクセルを「切り抜く」):
- 座標変換: キャンバスは通常ページ上で CSS により縮小表示されています。ストローク座標を
naturalWidth / clientWidthで元に戻さないと、マスクがずれてしまいます - 元に戻す: 各ストロークの前に
ctx.getImageData()でスナップショットを取り、putImageData()で復元します - マスクの膨張: ユーザーは対象物の中心だけをブラシでなぞりがちです。送信前にプログラムでマスクを数ピクセル広げます(プロ向けツールの「マスクを拡張」ボタン)。Python 側では
PIL.ImageFilter.MaxFilterまたは OpenCV のcv2.dilateを使います - 半透明プレビュー: ユーザー向けのハイライト(たとえば半透明の赤)は別のプレビューレイヤーに描画し、書き出すマスクレイヤーは厳密に二値の不透明/透明に保ちます
さらに進める: クリックまたはテキストでマスクを作る
ブラシの一歩先は、「人間のストローク」を「モデル推論」に置き換えることです:複数の参照画像 + マスク
典型的なシナリオ: 服の差し替え(1枚目が人物で、その後にスタイル / 生地の参照を続け、マスクは衣服の領域を示します):マスク外を厳密に保持する(ピクセルレベルの後処理)
モデルはマスク外の内容をわずかに変更することがあるため、ピクセル精度が重要なケース(商品写真、IDレイアウト、固定されたUIスクリーンショット)では、生成後にマスク外の領域を元画像から合成し直します。よくあるエラー
invalid_image_file / 画像ファイルまたはモードが無効です
invalid_image_file / 画像ファイルまたはモードが無効です
主な原因:
- マスクが有効な PNG ではない、またはファイルが破損している
- 拡張子は PNG だが、実際のエンコーディングが PNG ではない
- 画像モードが異常である(CMYK、パレットモード、alpha なし)
- アップロード時の MIME type が正しくない
- リクエスト前にファイルストリームがすでに消費されているか、閉じられている
画像とマスクの dimensions が一致しません
画像とマスクの dimensions が一致しません
1 ピクセルの差でも失敗します。修正方法:
白黒マスクに alpha channel がありません
白黒マスクに alpha channel がありません
RGB / L / P モードでは不十分です。マスクは RGBA である必要があります。変換には上の「方法 2」を使用してください。透過背景のリクエストが失敗する
透過背景のリクエストが失敗する
マスク自体には透過を含められます(それが編集領域の指定方法です)が、
gpt-image-2 は透過出力の背景をサポートしていません:"opaque" または "auto" を background に使用してください。"transparent" を渡すとエラーになります。response_format=url で画像が返らない
response_format=url で画像が返らない
GPT Image モデルは常に Base64 データを返します。
response_format は旧来の DALL·E 2 の動作にのみ適用されます。結果は次のように読み取ってください:Content-Type が multipart/form-data ではない
Content-Type が multipart/form-data ではない
通常は
Content-Type ヘッダーを手動で設定しているため(boundary が失われる)、または中間層が multipart リクエストを JSON に解析してから転送していることが原因です。HTTP クライアントに multipart ヘッダーを自動生成させてください。サイズパラメータ
gpt-image-2 は柔軟なサイズに対応しており、以下の条件がすべて適用されます:
1024x1024, 1536x1024, 1024x1536, 2048x2048, 2048x1152, 3840x2160, 2160x3840, auto. 正方形の画像は通常、より高速に生成されます。
本番用リクエストテンプレート
関連ページ
Image Edit API リファレンス
パラメータの完全なリファレンスとインタラクティブなプレイグラウンド
GPT-Image-2 の概要
モデルの機能、料金、バージョンノート
公式リファレンス(ブラウザーにコピーしてください):
- モデルページ:
developers.openai.com/api/docs/models/gpt-image-2 - Image edit API リファレンス:
developers.openai.com/api/reference/python/resources/images/methods/edit/ - 画像生成ガイド:
developers.openai.com/api/docs/guides/image-generation