Skip to main content
このページは、gpt-image-2POST /v1/images/edits 経由で使うローカライズ編集(inpainting)の実践ガイドです。画像 + マスク + prompt をアップロードして行います。完全なパラメータリファレンスとインタラクティブな Playground については、Image Edit API リファレンス をご覧ください。

コア原則: Alpha チャンネルが編集領域を定義します

ローカライズされた編集リクエストは、3つの部分で構成されます。
マスクは、PNG の alpha(透明度)チャンネル を通じて編集可能な領域を示します。
最もよくある間違い: 編集領域を決めるのは alpha チャンネル であり、見えている黒や白のピクセルではありません。
「黒白に見える」PNG でも alpha チャンネルがなければ、invalid_image_file で失敗します。

視覚的な例

元の画像が 1024×1024 だとします。
次のような prompt の場合:

マスクはハードクロップではありません

GPT Image のマスクは、フォトショップの選択範囲のような絶対的なピクセルレベルの制約ではありません。公式には、マスク編集は引き続き prompt ガイド型編集であり、モデルはマスクを参照として使用しますが、すべてのピクセル境界への厳密な準拠は保証しません。 そのため、次のような現象が見られることがあります。
  • マスク外の影がわずかに変化する
  • オブジェクトのエッジがマスクの外側まで伸びる
  • 照明や反射が連動して変化する
  • 背景がわずかに再描画される
  • マスク境界付近に遷移効果が出る
これは自然なブレンディングには適していますが、ピクセル単位での完全な保持が必要な場合には適しません(下の「マスク外のコンテンツを厳密に保持する」を参照してください)。

編集の安定性を高める

「赤いシャツに変えて」とだけ書かず、代わりに次のように書いてください。
実践的なヒント:
  1. マスクは対象オブジェクトのエッジより少し大きめにします
  2. オブジェクトの中心だけを覆わず、エッジ、影、反射も含めます
  3. 変えてはいけないものを明示的に指定します
  4. 編集領域が小さすぎる場合は、マスクを広げます
  5. 絶対的な保持が必要な場合は、最後に自分でピクセル合成を行います(下記参照)

マスクを使うべきか、使わないべきか? promptのみ編集とのトレードオフ

よくある疑問です:現代のAIは、平易な言葉だけで「指した場所をそのまま編集する」ことがすでにできるのに、なぜわざわざマスクを作るのでしょうか? 確かに、gpt-image-2はマスクなしでも、「テーブルの左側にあるカップを花に置き換えて」と伝えるだけで、たいていは適切な場所を編集します。指示追従性能は強く、気軽な編集なら prompt だけで十分です。ですが、マスクが解決するのは、言語が曖昧な場合、または曖昧ではなくてもまだ十分に信頼できない場合です: 研究結果も同じ方向を示しています。マスクなし(純粋にテキスト駆動)の編集は、精密な空間制御が苦手です。たとえば prompt-to-prompt 系の手法は、フレーム内で物体を空間的に移動させることができませんし、暗黙の編集領域がずれると、「変わるべき部分が変わらず、変わるべきでない部分が変わってしまう」という状態になります。マスクベースの編集は、少しの手軽さと引き換えに、明示的な空間精度を得られます。
一言で言うと: マスクは時代遅れの技術ではなく、「必須」から「精密制御ツール」へと役割が変わりました。カジュアルなチャット風の編集 → prompt だけで十分。本番ワークロードで、再現性・制御性・境界厳守が必要 → マスクを使ってください。また、gpt-image-2を使った promptのみ編集は実質的に 全体画像再生成 なので、指定していない領域も変わる可能性があります。だからこそ、マスク + ピクセル合成があるのです。

一目でわかるファイル要件

複数画像で編集する場合の役割割り当て:
「寸法が完全に一致している」と聞くと面倒そうですが、サイズを手作業で合わせる必要はありません。マスクは元の画像から派生するため(そのコピー上で消去・ブラシ・セグメンテーションを行います)、寸法は自動的に一致します。下の マスクはどこから来るのか をご覧ください。

Python の例

input_fidelity="high" を渡さないでくださいgpt-image-2 はデフォルトで入力画像を高い忠実度で処理します。API ではこのパラメータを調整できず、渡すと 400 エラーが返されます。単純に省略してください。

cURL の例

画像編集エンドポイントでは multipart/form-data が必要です — 画像とマスクを通常の JSON フィールドとして送信することはできません:
画像が1枚でも、公式の例と同じく image[] フィールド名を使ってください。
-F を使う場合は、-H "Content-Type: multipart/form-data" を手動で設定しないでください。curl は boundary を自動生成する必要があります。ヘッダーを手動で設定すると boundary が失われ、サーバーはファイルを解析できません。

Node.js の例

マスクはどこから来るのか? 5つの一般的な方法

人はしばしばマスクを難しく感じます — 「元の画像と1ピクセル単位で一致していなければならない」と思うからです。ここで重要なのは、マスクをゼロから描くことはほとんどなく、元の画像から導き出すという点です。コードでも、写真編集ソフトでも、Web キャンバスでも、流れは常に「元画像を開く → その上で領域を指定する → 書き出す」です。そのため、寸法の一致は自動的です。

方法 1: プログラムで透明マスクを生成する

長方形領域を透明(編集可能)に設定します:
  • (255, 255, 255, 255) = 不透明、保持する領域
  • (0, 0, 0, 0) = 透明、編集可能な領域

方法 2: 写真編集ソフトで手動消去する

透明 PNG をサポートする任意のエディタ(Photoshop、GIMP、Krita、Photopea など)ならマスクを作成できます。要するにやることは1つで、編集したい領域を消去して透明にすることです。Photoshop では:
  1. 元画像のコピーを開きます(元画像そのものを編集すると、寸法の一致が保証されます)
  2. レイヤーがロックされた「Background」の場合は、ダブルクリックして通常レイヤーに変換します(背景レイヤーは透明をサポートしていません)
  3. Lasso / Quick Selection / Object Selection ツールで、変更したい領域を選択します
  4. Delete を押します — 選択範囲が透明なチェッカーボードになります
  5. 「PNG として書き出し」(透明を有効にする)— これで有効な alpha マスクになります
GIMP でも考え方は同じです: Layer → Transparency → Add Alpha Channel、選択し、Delete して、PNG として書き出します。
形は長方形にまったく限定されません — なげなわで対象をなぞったり、スマート選択で被写体をワンクリックしたりすれば、消去された透明領域はどんな不規則な形にもなります。選択範囲をオブジェクトの輪郭より数ピクセル外側まで広げて(Photoshop: Select → Modify → Expand)、影やエッジも含めます。

方法 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」で変換してください。Stable Diffusion コミュニティの Inpaint Anything 拡張機能と ComfyUI の Mask Editor は、まさにこのパイプライン — 「SAM セグメンテーション + ブラシで微調整 → マスク → inpaint」 — を実装した成熟した例で、参考にする価値があります。

方法 5: 白黒マスクを alpha マスクに変換する

すでに「黒 = 編集、白 = 保持」のマスクがあるなら:

アップロード前にマスクを検証する

多くの invalid_image_file エラーは、ファイルに .png 拡張子が付いていても RGB チャンネルしかなく、アルファチャンネルがないことが原因です。アップロード前にこれを実行してください:

マスクの形状とブラシ式編集の仕組み

マスクはどんな不規則な形でもよい

マスクは本質的にはピクセルごとのビットマップであり、幾何学的な形ではありません。各ピクセルがそれぞれ独自のアルファ値を持ちます。つまり:
  • 長方形や円は、もっとも単純な例にすぎません
  • 人物のシルエット、髪の毛の端、フリーハンドの落書き、あるいは複数に分かれた断片もすべて有効です
  • 実際にはほとんどのマスクは不規則で、対象物の輪郭に沿い、少し広げた形になります
唯一の「形状のアドバイス」はルールではなく結果についてのものです。透明領域は対象物を縁、影、反射まで含めて完全に覆うようにしてください。モデルが自然にブレンドする余裕を持てるよう、少し大きめに見積もるのがよいです。

ブラシ式編集の実装方法

写真アプリでの「変更したい場所をブラシでなぞる」操作は、フロントエンドでは驚くほど単純です。**2枚のレイヤーを重ね、ブラシで上のレイヤーを透明に「消していく」**だけです。
中核は1行です — キャンバスの合成モードをdestination-outに設定します(新しいストロークが既存ピクセルを「切り抜く」):
重要な実装ポイント:
  1. 座標変換: キャンバスは通常ページ上で CSS により縮小表示されています。ストローク座標をnaturalWidth / clientWidthで元に戻さないと、マスクがずれてしまいます
  2. 元に戻す: 各ストロークの前にctx.getImageData()でスナップショットを取り、putImageData()で復元します
  3. マスクの膨張: ユーザーは対象物の中心だけをブラシでなぞりがちです。送信前にプログラムでマスクを数ピクセル広げます(プロ向けツールの「マスクを拡張」ボタン)。Python 側ではPIL.ImageFilter.MaxFilterまたは OpenCV のcv2.dilateを使います
  4. 半透明プレビュー: ユーザー向けのハイライト(たとえば半透明の赤)は別のプレビューレイヤーに描画し、書き出すマスクレイヤーは厳密に二値の不透明/透明に保ちます

さらに進める: クリックまたはテキストでマスクを作る

ブラシの一歩先は、「人間のストローク」を「モデル推論」に置き換えることです:
これこそが Inpaint Anything と ComfyUI の Mask Editor の仕組みです。セグメンテーションが精度を担い、ブラシが修正を担います。まず正確なマスクを自動生成し、その後に追加・削除のブラシストロークで微調整します。自社プロダクトでは、ブラシキャンバスをフォールバックとして残しつつ SAM をバックエンドサービスとして配置する構成が、現時点で最もよい UX の組み合わせです。

複数の参照画像 + マスク

典型的なシナリオ: 服の差し替え(1枚目が人物で、その後にスタイル / 生地の参照を続け、マスクは衣服の領域を示します):
複数の画像を使う場合、prompt では 各画像の役割を明確に説明する 必要があります(1枚目 = 被写体、2枚目 = スタイル参照、3枚目 = 生地参照)。そうしないと、モデルがそれらを混同する可能性があります。

マスク外を厳密に保持する(ピクセルレベルの後処理)

モデルはマスク外の内容をわずかに変更することがあるため、ピクセル精度が重要なケース(商品写真、IDレイアウト、固定されたUIスクリーンショット)では、生成後にマスク外の領域を元画像から合成し直します。
結果: マスク内はAIによる編集、マスク外は元の画像で、境界は軽くフェザー処理されています。

よくあるエラー

主な原因:
  • マスクが有効な PNG ではない、またはファイルが破損している
  • 拡張子は PNG だが、実際のエンコーディングが PNG ではない
  • 画像モードが異常である(CMYK、パレットモード、alpha なし)
  • アップロード時の MIME type が正しくない
  • リクエスト前にファイルストリームがすでに消費されているか、閉じられている
再エンコードするとほとんどの場合は解決します:
1 ピクセルの差でも失敗します。修正方法:
RGB / L / P モードでは不十分です。マスクは RGBA である必要があります。変換には上の「方法 2」を使用してください。
マスク自体には透過を含められます(それが編集領域の指定方法です)が、gpt-image-2 は透過出力の背景をサポートしていません:
"opaque" または "auto"background に使用してください。"transparent" を渡すとエラーになります。
GPT Image モデルは常に Base64 データを返します。response_format は旧来の DALL·E 2 の動作にのみ適用されます。結果は次のように読み取ってください:
通常は 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