|

gpt-image-2.6-all の2K/4Kについて、返却値のsizeを信用しないこと

gpt-image-2.6-all の2K/4Kについて、返却値のsizeを信用しないこと

作者注:gpt-image-2.6-all の 2K/4K は超解像(アップスケール)系の設定のため、レスポンスに size が返ってこないことがあります。実際のピクセル数もたまにずれます。この記事ではその理由を整理し、画像を保存してから実際の幅と高さを読み取り、レイアウトに使う方法を紹介します。

画像生成APIをポスターテンプレートやEC向けのメイン画像、動画カバーのパイプラインに組み込むとき、レスポンスの size フィールドをそのまま読み取り、キャンバスやレイアウトの計算に使っている人は多いのではないでしょうか。gpt-image-2.6-all の 2K/4K 設定では、この方法にはリスクがあります。APIYI(apiyi.com)が 2026-11-11 に公開したモデル説明には、2K/4K は超解像の設定であり、レスポンスで size が返らない場合があること、一部のケースでは実際のピクセル数が想定と異なることが明記されています。サイズは画像ファイルの実際の幅と高さを基準にする、というのがドキュメントの結論です。

この問題はレイアウト結果に直接影響します。 たとえば 1365x2048 の画像を 9:16 として縦長テンプレートに配置すると、余白が出たり画像が引き伸ばされたりします。被写体が見切れてしまうこともあります。

この記事で得られること:2K/4K 設定でレスポンスのフィールドに頼れない理由がわかります。さらに、画像を保存して実際のピクセル数を読み取り、そのうえでレイアウト処理に渡す方法も身につきます。

gpt-image-2-6-all-2k-4k-real-image-size-ja-image-0


gpt-image-2.6-all 2K/4K サイズの重要ポイント

下の表は、ドキュメントに記載されているサイズ関連の情報をまとめたものです。以降のコードやレイアウト方針は、すべてこの内容を前提にしています。

ポイント 説明 レイアウトへの影響
2K/4K は超解像ティア 最終ファイルは超解像処理を経ており、ピクセル数は超解像の段階で決まる リクエストパラメータから最終サイズを割り出すことはできない
size が返らないことがある 2K/4K ティアのレスポンスでは size フィールドを取得できない場合がある このフィールドに依存するコードは、空の値を読み込んだりエラーになったりする
ピクセル数がまれにずれる 9:16 でまれに 1365x2048、4K でまれに 4096x2731 になる 縦横比がリクエストした比率と異なることがある
quality=low では差が出る 2K ティアで 2048x1153 が出力されることがある 辺の長さが奇数になり、一部の動画エンコード処理でエラーになる
実際の縦横ピクセルが基準 ドキュメントでは、画像ファイルの実際の縦横サイズを基準とすると明記されている 画像を保存してからピクセル数を読み取る方法が、唯一信頼できるデータソース

gpt-image-2.6-all の 2K/4K で size フィールドが当てにならない理由

超解像ティアは、2つのステップで考えるとわかりやすいです。まずベースとなる画像を生成し、それを 2K または 4K に拡大します。最終ファイルのピクセル数は超解像の段階で決まるため、レスポンス構造に含まれる size フィールドが、実際のファイルと同期しているとは限りません。ドキュメントでも、2K/4K については「size が返らない場合がある」と説明されています。つまり、同じコードでも、フィールドを読み取れるときと読み取れないときがあるということです。

本当に厄介なのは、フィールドが存在しているのに、ファイルの実サイズと一致していないケースです。コードはエラーを出さず、数値も一見正常に見えるため、レイアウト結果が出てから初めて間違いに気づくことになります。そのため、size を寸法の取得元にしないのが安全です。size はせいぜいログとの照合に使う程度にとどめましょう。レイアウトに使う縦横のサイズは、保存した画像ファイルから必ず読み取ってください。

gpt-image-2.6-all 2K/4K 既知のピクセルずれを読み解く

ドキュメントには、ときどき発生するピクセルサイズのずれがいくつか記載されています。下の表は、そのピクセル数を縦横比に換算したものです。レイアウトにどんな影響が出るかを判断する際の目安にしてください。

シーン 実際に出力される可能性のあるピクセル数 換算した縦横比 レイアウト上のリスク
9:16 の比率 1365x2048 約 0.667(2:3 に近い) 9:16 のテンプレートに配置すると、左右に余白ができるか、はみ出して切り取られる
4K 設定 4096x2731 約 1.5(3:2 に近い) 短辺が想定と合わず、固定キャンバスでは位置がずれる
2K 設定 + quality=low 2048x1153 約 1.776(16:9 に近い) 高さが奇数のため、偶数の辺の長さを必要とするエンコード処理が失敗する

これらの例を見ると、長辺はたいてい 2048 か 4096 に収まり、短辺は一定ではないことがわかります。1つ目のケースは比率のずれがはっきりしていて、9:16 は約 0.5625 なのに対し、1365x2048 は約 0.667 です。リクエストした 9:16 のままキャンバスを計算してしまうと、余白がかなり目立ちます。3つ目のケースは比率こそほとんど変わりませんが、1153 は奇数です。一般的な動画エンコードのピクセルフォーマットでは幅と高さが偶数であることが求められるため、この画像を動画のカバーや最初のフレームにそのまま使うと、トランスコード時にエラーが出る場合があります。

こうしたケースは「ときどき」しか起こりません。テスト中に数枚生成して問題がなくても、本番公開後に初めて遭遇することがあります。そのため、検証ロジックは生成のたびに実行するようにし、テスト段階での抜き取り確認だけで済ませないようにしましょう。

gpt-image-2-6-all-2k-4k-real-image-size-ja-image-1


gpt-image-2.6-all 2K/4K クイックスタート:実際のピクセル数を読み取る

ポイントは一つだけです。まず画像のバイナリデータを取得して保存し、それから画像ライブラリで幅と高さを読み取ります。以下のサンプルでは、OpenAI互換のPython SDKとPillowを使っています。2K/4Kの解像度ティアやアスペクト比などのリクエストパラメータの具体的な書き方は、APIYIのドキュメントを参照してください。サンプルではプレースホルダーのみ残しています。

最小限のサンプル:レスポンスの size と実際のピクセル数を比較する

このコードは画像を1枚生成し、レスポンスのフィールドと実際のピクセル数を両方出力します。両者の違いがひと目で確認できます。

import base64, io, requests
from openai import OpenAI
from PIL import Image

client = OpenAI(api_key="YOUR_API_KEY", base_url="https://api.apiyi.com/v1")

resp = client.images.generate(
    model="gpt-image-2.6-all",
    prompt="一张竖版城市夜景海报",
    # 2K/4K の解像度パラメータは APIYI のドキュメントに従って指定してください
)
item = resp.data[0]
raw = base64.b64decode(item.b64_json) if item.b64_json else requests.get(item.url, timeout=120).content

img = Image.open(io.BytesIO(raw))
print("真实像素:", img.size)                       # (幅,高さ)
print("响应 size:", getattr(resp, "size", None))   # 2K/4K では None になることがあります

コード内で getattr を使って size を読み取っているのは、フィールドが存在しない場合でも例外を投げないようにするためです。また、URLで返ってくる場合とbase64で返ってくる場合の両方に対応しており、後続の処理は画像のバイナリデータだけに依存します。ドキュメント上、お使いの接続方式が別のエンドポイントを使う場合でも、変更が必要なのは「画像データを取得する」ステップだけです。ピクセル数を読み取る部分はそのまま使えます。

完全な実装:保存後に検証してレイアウト用パラメータを生成する

本番環境では、次の処理を1つの関数にまとめておくのがおすすめです。ファイルの保存、実際の幅と高さの取得、レスポンスのフィールドとの照合、アスペクト比のずれと奇数サイズの辺のチェック、そして実サイズに基づく縮小・拡大結果の計算です。

import base64
import io
from pathlib import Path
from uuid import uuid4

import requests
from openai import OpenAI
from PIL import Image

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.apiyi.com/v1",
)

# 2K/4Kのティア、比率などのパラメータはAPIYIのドキュメントに従ってください。ここではプレースホルダーです
TIER_PARAMS = {}


def fetch_image_bytes(item) -> bytes:
    if getattr(item, "b64_json", None):
        return base64.b64decode(item.b64_json)
    return requests.get(item.url, timeout=120).content


def parse_declared_size(resp):
    size = getattr(resp, "size", None)
    if not size or "x" not in str(size).lower():
        return None
    w, h = str(size).lower().split("x")
    return int(w), int(h)


def generate_and_measure(prompt, expected_ratio=None, out_dir="outputs"):
    resp = client.images.generate(
        model="gpt-image-2.6-all",
        prompt=prompt,
        **TIER_PARAMS,
    )
    raw = fetch_image_bytes(resp.data[0])
    img = Image.open(io.BytesIO(raw))
    width, height = img.size  # 信頼できる唯一のサイズ情報源

    Path(out_dir).mkdir(exist_ok=True)
    ext = (img.format or "png").lower()
    path = Path(out_dir) / f"{uuid4().hex[:8]}_{width}x{height}.{ext}"
    path.write_bytes(raw)

    declared = parse_declared_size(resp)
    report = {
        "path": str(path),
        "width": width,
        "height": height,
        "declared": declared,
        "declared_match": (declared == (width, height)) if declared else None,
        "odd_dimension": width % 2 == 1 or height % 2 == 1,
    }
    if expected_ratio:
        real_ratio = width / height
        report["ratio_drift"] = round(abs(real_ratio - expected_ratio) / expected_ratio, 4)
    return report


def fit_into_box(width, height, box_w, box_h, mode="contain"):
    if mode == "contain":
        scale = min(box_w / width, box_h / height)
    else:
        scale = max(box_w / width, box_h / height)
    return round(width * scale), round(height * scale)


if __name__ == "__main__":
    r = generate_and_measure("竖版城市夜景海报", expected_ratio=9 / 16)
    print(r)
    if r.get("ratio_drift", 0) > 0.01:
        print("比例漂移超过 1%,建议改用 contain 或重新生成")
    print(fit_into_box(r["width"], r["height"], 1080, 1920))

この実装には、押さえておきたい設計上のポイントが3つあります。

  • ファイル名に実際の幅と高さを含める:下流のサービスで再度デコードしなくても、ファイル名を見るだけでサイズがわかります。
  • declared_match はログ専用:フィールドの欠落や不一致がどのくらいの頻度で起きているかを集計できますが、レイアウト計算には使いません。
  • odd_dimension で事前に検出する:2048x1153 のような画像は、動画エンコードに入れる前に1ピクセル分をトリミングするか、パディングで補えます。

🚀 はじめ方のヒント:まずはAPIYI(apiyi.com)で1つのキーを使い、2Kと4Kの両ティアを実際に動かしてみましょう。上の report を出力すれば、フィールドの欠落やアスペクト比のずれが実際にどのくらい起きるかがわかります。その結果をもとに、本番環境の許容しきい値を決めるのがおすすめです。プラットフォームはOpenAI互換のインターフェースなので、サンプルコードは base_url を書き換えるだけで動作します。


gpt-image-2.6-all 2K/4K レイアウト対応方針

実際のピクセル数を取得するのはまだ第一歩にすぎません。次のステップは、レイアウトのロジックをすべてそのデータに基づいて動かすことです。まず、3種類のサイズ情報の取得元を比較し、どれを判断に使えるのかをはっきりさせましょう。

情報の取得元 信頼性 2K/4K での挙動 推奨される用途
リクエスト時に選んだ解像度とアスペクト比 低 超解像後の実際のピクセル数がずれることがある 期待値の表現、比率ドリフトの基準として使う
レスポンス内の size フィールド 低 返ってこない場合も、ファイルと一致しない場合もある ログへの記録と統計のみに使う
画像ファイルの実際の幅と高さ 高 ドキュメントでもこれが正と明記されている レイアウト・トリミング・エンコードの唯一の根拠

各工程で gpt-image-2.6-all 2K/4K の実際の幅と高さを取得する

画像はバックエンドで生成され、フロントエンドで表示され、最後に動画ツールへ渡されることもあります。どの工程にも実際のピクセル数を読み取る方法があるので、サイズ情報をずっと引き回す必要はありません。

工程 取得方法 注意点
Python バックエンド Pillow の Image.open(...).size ファイルヘッダーだけで幅と高さが取れるため、負荷は小さい
ブラウザ(フロントエンド) img.naturalWidth / img.naturalHeight onload の後で読み取る。CSS のレンダリングサイズは読まない
コマンドラインやトランスコード ffprobe または ImageMagick の identify エンコードに入る前に、辺の長さが偶数かどうかもあわせて確認する
オブジェクトストレージ アップロード時に幅と高さをメタデータまたはファイル名に書き込む 後続のサービスがそのまま読み取れ、再度デコードする必要がない

最もハマりやすいのがフロントエンドです。多くのコンポーネントは画像に固定の幅と高さを設定しているため、読み取れるのは画像本来のピクセル数ではなく、レンダリング後のサイズになってしまいます。元画像が 9:16 に近いかどうかを判断するには、naturalWidth と naturalHeight を使ってください。

gpt-image-2.6-all 2K/4K における比率ドリフトへの対処戦略

比率ドリフトを完全になくすことはできません。できるのは、ドリフトが起きたときにどう処理するかを事前に決めておくことです。以下の3つの戦略は、リスクの低い順に並べています。

戦略 方法 向いているシーン コスト
contain フィット 実際の幅と高さに合わせて縦横比を保ったまま縮小し、キャンバスに全体を収める ポスターや詳細ページなど、被写体を切り取れないシーン 余白が出ることがあり、背景色やぼかした下地画像での埋め合わせが必要
cover トリミング 縦横比を保ったまま拡大してキャンバスを埋め、はみ出た部分を切り取る カバー画像やバナーなど、端の情報が重要でないシーン 被写体が端に寄っていると切り取られるおそれがある
ドリフト時の再生成 比率のドリフトがしきい値を超えたら、もう一度生成する 比率に厳しいテンプレート 追加の呼び出し費用と待ち時間がかかる

辺の長さが奇数の場合は、エンコードに入る前に統一して処理することをおすすめします。1ピクセル切り落とすか、1ピクセル分の単色の縁を足す方法です。2048x1153 を 2048x1152 にトリミングすれば、ちょうど標準の 16:9 になり、見た目の違いはほとんどわかりません。

gpt-image-2-6-all-2k-4k-real-image-size-ja-image-2


gpt-image-2.6-all 2K/4K よくある質問 FAQ

Q1: gpt-image-2.6-all の 2K/4K 档とは何ですか?

APIYI が 2026-11-11 に公開したモデル説明によると、2K/4K はアップスケール(超解像)档で、最終的な画像は超解像処理を経て出力されます。通常の档とサイズの挙動が異なるのもこのためで、レスポンスに size が返ってこない場合があるほか、実際のピクセル数にも時々ズレが生じます。

Q2: 2K/4K 档では、レスポンスの size とファイルの実寸のどちらを信用すべきですか?

ファイルの実寸です。ドキュメントにも、画像の実際の幅と高さを基準にすると明記されています。2K/4K 档ではレスポンスの size が欠落することがあり、存在する場合でもログに記録する程度にとどめてください。キャンバスやクロップ領域、エンコードパラメータの計算には使わないほうが安全です。

Q3: 想定と異なるサイズには、どのようなものがありますか?

ドキュメントに挙げられているのは次のケースです。9:16 で `1365×2048` が時々出る、4K で `4096×2731` が時々出る、quality=low の場合に 2K 档で `2048×1153` が出ることがある、というものです。いずれも偶発的に発生するため、テスト時の抜き取りチェックだけで済ませず、生成のたびに検証を実行してください。

Q4: テスト段階で数枚だけ検証し、本番では検証しなくても大丈夫ですか?

おすすめしません。偶発的な問題は、少数のサンプルでは一度も現れないことがよくあります。幅と高さの読み取りにかかるコストは小さく、Pillow ならファイルヘッダーを解析するだけで済みます。検証を生成関数に組み込んでおくほうが、レイアウト崩れを後から調べるよりずっと楽です。

Q5: API で gpt-image-2.6-all をすばやく呼び出し、サイズを検証するにはどうすればよいですか?

手順は次のとおりです。

1. APIYI(apiyi.com)でアカウントを登録し、APIキーと新規ユーザー向けのテスト用クレジットを取得します
2. サンプルコードの base_url を `https://api.apiyi.com/v1` に設定し、档のパラメータはドキュメントに従って指定します
3. 完全な実装コードを実行し、report の declared_match、ratio_drift、odd_dimension を確認します

Q6: 2K 档で高さが奇数になると、どのような影響がありますか?

静止画として表示するだけなら、通常は問題ありません。ただし、画像を動画の最初のフレームやカバー、トランスコード用の素材として使う場合、多くのエンコード処理では幅と高さが偶数であることが求められます。`2048×1153` のようなサイズが返ってきたら、1 ピクセル分を切り取るか補ってから、エンコーダーに渡すことをおすすめします。

Q7: gpt-image-2.6-all の料金体系はどうなっていますか?

ドキュメントでは従量課金(1 回あたり $0.025)と記載されています。「アスペクト比のズレが閾値を超えたら再試行する」という方針を採る場合は、再試行の回数もコストに含めて考える必要があります。まず APIYI(apiyi.com)のテスト用クレジットでズレの発生頻度を集計し、そのうえで閾値をどこまで厳しくするかを決めるとよいでしょう。


gpt-image-2.6-all 2K/4K 核心要点(Key Takeaways)

  • 2K/4Kは超解像(アップスケール)ティア:最終的なピクセル数は超解像の工程で決まるため、リクエストパラメータから推測することはできません。
  • sizeフィールドに頼らない:2K/4Kのレスポンスにはsizeが返ってこない場合があります。ログとの照合程度にとどめましょう。
  • ズレは偶発的で再現しにくい:1365x2048、4096x2731、2048x1153 といったサイズが本番環境で出ることがあります。
  • まず保存してからピクセルを読む:Pillow や naturalWidth でファイルの実際の幅と高さを取得し、そのうえでレイアウトを組みます。
  • 奇数の辺は事前に処理する:動画エンコードに渡す前に、1ピクセル分をトリミングするか補完しておきます。
  • テスト枠でしきい値を決める:APIYI(apiyi.com)で少量のバッチを回してズレの発生頻度を集計し、そのうえでリトライ方針を決めましょう。

まとめ

gpt-image-2.6-all の 2K/4K サイズを扱うポイントは次の3つです。

  1. レスポンスのsizeを信用しない:超解像ティアでは返ってこないことがあり、返ってきても実際のファイルと一致しているとは限りません。
  2. 画像の実際の幅と高さを基準にする:画像を保存してからピクセルを読み取ることが、ドキュメントでも明確に定められた判断基準です。
  3. レイアウトロジックはズレを許容する:contain や cover、リトライ方針で比率のズレに対応し、奇数の辺も事前に処理します。

「実際のピクセルを読み取る」処理を生成関数の中に組み込めば、レイアウト崩れを根本から防げて、後続の処理でレスポンスのフィールドが信頼できるかどうかを気にする必要もなくなります。APIYI(apiyi.com)なら1つのAPIキーで上記の検証フローをひととおり試せるので、お使いのテンプレートで 2K/4K ティアが安定して動作することを確認してから本番に出すのがおすすめです。


📚 参考資料

  1. APIYI gpt-image-2.6-all リリースノート:2K/4K 超解像ティア、size のエコーバックと実際のピクセル数について
  2. リンク: docs.apiyi.com/live/2026-11/gpt-image-2-6-all-launch
  3. 説明:超解像ティアの定義、まれに発生するピクセル数のズレ、実際の幅・高さを基準にする際の注意点、1回あたりの料金を掲載しています

  4. Pillow 公式ドキュメント:Python の画像読み込みライブラリ

  5. リンク: pillow.readthedocs.io
  6. 説明:Image.open と size 属性の使い方を解説しており、バックエンドで実際のピクセル数を取得する際に役立ちます

  7. MDN HTMLImageElement ドキュメント:ブラウザ側の画像プロパティに関する解説

  8. リンク: developer.mozilla.org/docs/Web/API/HTMLImageElement
  9. 説明:naturalWidth と naturalHeight の意味、およびレンダリングサイズとの違いを説明しています

著者:APIYI 技術チーム
技術交流:APIYI のウェブサイトトップページからお気軽にお問い合わせください。詳しい資料は docs.apiyi.com のドキュメントセンターでご覧いただけます

関連記事

類似投稿