🎨

OpenAIが画像生成APIを公開!使い方・機能・コストを実践レビュー

に公開

こんにちは、酒井です!
株式会社 EGGHEAD(エッグヘッド)という「製造業で生成 AI を活用したシステム開発」をしている会社の代表をしております。

https://egghead.co.jp?utm_source=zenn&utm_medium=social&utm_campaign=normal

本記事の目的

最近、ChatGPTの画像生成がどんどん進化していて、SNSなどでもよく話題になっていると思います。そんな中、4/24にOpenAIから画像生成のAPIが公開されました。

https://x.com/OpenAIDevs/status/1915097067023900883

このAPIを使うとどういう画像が出てくるのか、Web版ではできないことができるのかなど気になると思います。この記事では、概要から具体的な使い方、注意点までを詳しく解説します。

Youtubeにも同じ内容でアップロードしているので、動画で知りたいという方はこちらをぜひチェックしてみてください!

https://youtu.be/9GtFBzCk0Ss?si=CwbW1-wgi6eIGlfU

ChatGPT画像生成APIの概要と特徴

こちらのドキュメントに詳しく書いてありますが、ここでは内容を掻い摘んで書いていきます。

https://platform.openai.com/docs/guides/image-generation?image-generation-model=gpt-image-1

利用可能なモデル

OpenAIで利用できるモデルは以下のようになっています。

  • DALL-E 2
  • DALL-E 3
  • GPT Image

ジブリ風画像などで話題になっていて、新しく追加されたモデルがGPT Imageになっています。今回はこちらのモデルを使っていきます。

主な機能

こちらのAPIでできる主な機能は以下の3つです。

  1. テキストからの画像生成: プロンプトに基づいてゼロから画像を生成します。
  2. 画像の編集(マスク): 画像の一部をマスク(透明化)し、その部分をプロンプトに基づいて再生成します。
  3. 画像合成 複数の画像を参照として新しい画像を生成することができます。

主な仕様

パラメーターとして色々付けることができます。

  1. 画像サイズ: 画像の大きさを指定することができます。ただし、1024x10241536x10241024x1536のいずれかしか指定できません。
  2. 品質: lowmediumhighの中から画質を指定することができます。
補足(クリックで展開)

ドキュメントには載ってませんでしたが、メソッドを見ると他にも色々指定できそうだったので、興味のある人は試してみても面白そうです。

    def generate(
        self,
        *,
        prompt: str,
        background: Optional[Literal["transparent", "opaque", "auto"]] | NotGiven = NOT_GIVEN,
        model: Union[str, ImageModel, None] | NotGiven = NOT_GIVEN,
        moderation: Optional[Literal["low", "auto"]] | NotGiven = NOT_GIVEN,
        n: Optional[int] | NotGiven = NOT_GIVEN,
        output_compression: Optional[int] | NotGiven = NOT_GIVEN,
        output_format: Optional[Literal["png", "jpeg", "webp"]] | NotGiven = NOT_GIVEN,
        quality: Optional[Literal["standard", "hd", "low", "medium", "high", "auto"]] | NotGiven = NOT_GIVEN,
        response_format: Optional[Literal["url", "b64_json"]] | NotGiven = NOT_GIVEN,
        size: Optional[
            Literal["auto", "1024x1024", "1536x1024", "1024x1536", "256x256", "512x512", "1792x1024", "1024x1792"]
        ]

動作検証

環境準備

まず、Python環境とOpenAIのライブラリ、および環境変数を読み込むためのライブラリが必要です。

pip install openai python-dotenv

また、OpenAI APIキーを取得し、.env ファイルなどに設定しておく必要があります。

import base64
import datetime
import os

from dotenv import load_dotenv
from openai import OpenAI

load_dotenv()

client = OpenAI()

テキストからの画像生成

ここでは、製造業向けの勉強会のチラシ画像を生成する例を紹介します。実際に使用したコードは以下の通りです。

prompt = """
製造業向けの勉強会を開きます。
以下の内容でチラシを作ってください。
アイソメトリック調のデザインにしてください。
必ず文字を画像内にすべて収まるようにしてください。
文字は全体を考えてバランスよく配置してください。

・製造業向け生成AIの活用事例の紹介&交流会
・5/15 (木) 18:00-21:15
・参加費:5000円
・場所:ピー・アイ・スクエア(横浜駅徒歩5分)
・持ち物:ノートPC (推奨)
"""

result = client.images.generate(
    model="gpt-image-1",
    prompt=prompt,
    quality="low",
    size="1536x1024"
)

image_base64 = result.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

# # 一意のファイル名を生成(例: output_20240611_153045.png)
os.makedirs("tmp", exist_ok=True)
filename = f"tmp/output_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
with open(filename, "wb") as f:
    f.write(image_bytes)

一部文字が崩れていますが、Web板のChatGPTで生成される画像をAPIから生成することができました。

画像の編集(マスク)

次に、生成した画像の一部(例: 見切れた文字)を修正するデモです。

まずは以下の準備をします。

  1. 元画像: 編集したい画像
  2. マスク画像: 編集したい領域を透明にした画像。元画像と同じサイズである必要があります。Macのプレビューでマスクを作成しましたが結構大変で、画像編集ツールを使う方が効率的だと思います。

今回使ったのは以下の2枚です。元画像は画像下部の文字が見切れているので、これを修正したいと思います。

元画像

マスク画像

補足(クリックで展開)

きちんと透明にした画像を指定しないと以下のエラーになります。

openai.BadRequestError: Error code: 400 - {'error': {'message': 'Invalid mask image format - mask image missing alpha channel', 'type': 'invalid_request_error', 'param': None, 'code': 'invalid_mask_image_format'}}
# --- 画像編集(マスク) ---
prompt2 = """
空きスペースに以下の内容を記載してください。
必ず文字を画像内にすべて収まるようにしてください。
文字は全体を考えてバランスよく配置してください。

・参加費:5000円
・場所:ピー・アイ・スクエア(横浜駅徒歩5分)
・持ち物:ノートPC (推奨)
"""

result2 = client.images.edit(
    model="gpt-image-1",
    prompt=prompt2,
    image=open("tmp/output_20250426_214323.png", "rb"),
    mask=open("tmp/output_20250426_214323_mask.png", "rb"),
)

image_base64 = result2.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

# 一意のファイル名を生成(例: output_20240611_153045.png)
os.makedirs("tmp", exist_ok=True)
filename = "tmp/output_20250426_214323_2.png"
with open(filename, "wb") as f:
    f.write(image_bytes)

見て分かる通り、見切れていた文字を修正することに成功していました。ただし、マスク部分以外も若干変化していたのでその点は注意が必要です。

画像合成

最後に複数の画像を使って合成するデモをしていきたいと思います。
今回は2つのキャラクター組み合わせて「学校で教授と学生が話している」シーンを生成します。
2つの元画像は以下の通りです。

教授

学生

# --- 画像合成風(複数画像をimageパラメータに指定) ---
prompt3 = """
学校で教授と学生が話をしている画像を作成します。
教授と学生のイラストに合わせたテイストにしてください。
黒板を背景に話をしているようなイメージです。
"""

result3 = client.images.edit(
    model="gpt-image-1",
    prompt=prompt3,
    image=[
        open("tmp/hakase1.png", "rb"),
        open("tmp/サラリーマン1.png", "rb"),
    ],
)


image_base64 = result3.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

os.makedirs("tmp", exist_ok=True)
filename = f"tmp/output_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
with open(filename, "wb") as f:
    f.write(image_bytes)

見ての通りで指定した内容で複数の画像を組み合わせた新しい画像を生成することができました。

品質 (quality) の影響

画像生成時に quality="low" を指定して生成してみました。

quality="low" で生成した場合、画像のディテールが粗くなり、文字の表示が崩れたり、全体的に歪んだ画像になりました。基本的にqualityhighにするでいいと思いました。

コストについて

APIの利用にはコストがかかります。gpt-image-1 モデルで10〜15枚程度の画像を生成したところ、約3ドルかかりました。なので、1枚あたり0.2〜0.3ドル程度が目安となりそうです。

料金は品質、サイズによって異なります。正確な料金はOpenAIのCost and latencyページで確認してください。

注意点

こちらの記事で紹介されているOpenAIが提供している無料利用枠は、画像生成APIには適用されません

https://zenn.dev/schroneko/articles/openai-api-free-tokens

まとめ

ここまで読んでいただきありがとうございました!
この記事では、ChatGPT画像生成APIの主要な機能である①テキストからの画像生成、②画像の編集(マスク)、そして③画像合成について、実装例とともに見てきました。

こちらのAPIを利用することで、Web 版と同様の機能をプログラムから呼び出し、既存のシステムやアプリケーションと連携させることが可能になります。例えば、ユーザーの入力に基づいて動的に画像を生成したり、定型的な画像作成タスクを自動化することができます。

私の会社ではこういった既存のシステムにAPI連携させるといった相談も受け付けているので、もしご興味あれば下のフォームよりご相談ください。

GitHubで編集を提案
EGGHEAD テックブログ

Discussion