OpenAI の新API「GPT Image API（gpt-image-1）」を使った画像生成を試す

## はじめに

今まで、ChatGPT の中でしか使えなかった新しい画像生成機能が、API経由でも利用できるようになったので、さっそく試してみました。

### GPT Image API とモデルの情報

以下が、その API軽油での画像生成という話に関する、公式のヘルプセンターのページです。


●GPT Image API | OpenAI Help Center
　https://help.openai.com/en/articles/11128753-gpt-image-api

新API「GPT Image API」について書かれた上記の公式ページを見ると、冒頭の部分ではプロンプトと生成された画像の例が掲載されており、この画像生成でできることをざっと知ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e89ef658-3974-4c8a-ac9e-6961d7972377.png)


#### 過去のモデルとの違い

先ほどのヘルプセンターのページの中で、下のほうを見ていくと、以下のように過去のモデルとの違い・使い分けについても書かれていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8d989bf1-06ab-45b9-8d33-474dbd1d12ec.png)

「GPT Image」については、「生成と編集ができ、高品質な画像の生成・背景透過などが可能」といった説明が書いてあります。


#### モデルの情報

モデルのページ（ https://platform.openai.com/docs/models/gpt-image-1 ）を見てみると、価格の情報が以下のようなフォーマットで掲載されていました。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4e483f6c-3406-4a31-8ab2-d4243c933db9.png)


#### API利用時の制約

この GPT Image API を利用するにあたって、ちょっと前に以下の記事に書いた「API Organization Verification」が必要になりそうでした。

●OpenAI の o3 の API の利用条件【公式情報より】： Tier が 1〜3 の場合は「API Organization Verification」が必要 - Qiita
　https://qiita.com/youtoy/items/7e7807d7af704154eb67


例えば自分の場合は、公式のプレイグラウンドで画像生成の API を試す画面を開いた時に、以下の Verification（認証）を促す画面が出ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b383398c-629f-40de-9ba2-62ff7b3ea2e9.png)


この認証の話は、記事の最後のところで少し触れようと思います。
なお、この記事は上記の認証を済ませた後に進めた手順になります。


## 公式情報を見つつ API を試す

この後の部分は、以下の公式の情報を見つつ API を試していきます。
以下は英語の公式ページですが、もし日本語の情報を見たい場合は [npakaさんの記事](https://note.com/npaka/n/n44f3712ac0f2)など、日本語で書かれた記事を見てみると良いかもしれません。

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


### API の使い方

[Generate Images](https://platform.openai.com/docs/guides/image-generation#generate-images) の部分を見てみると、画像生成のためのコードサンプルや生成される画像が掲載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3fe6d0d2-f503-40b1-8b1d-95bbdb19af65.png)

掲載されているコードは以下の通りです。
今回利用するモデル名は「gpt-image-1」になるようです。

```javascript
import OpenAI from "openai";
import fs from "fs";
const openai = new OpenAI();

const prompt = `
A children's book drawing of a veterinarian using a stethoscope to 
listen to the heartbeat of a baby otter.
`;

const result = await openai.images.generate({
    model: "gpt-image-1",
    prompt,
});

// Save the image to a file
const image_base64 = result.data[0].b64_json;
const image_bytes = Buffer.from(image_base64, "base64");
fs.writeFileSync("otter.png", image_bytes);
```

さらにページの下を見ていくと、他のサンプルも掲載されています。
その中には、[「png・webp での背景透過」を実現するコードサンプル（Transparency という項目の部分）](https://platform.openai.com/docs/guides/image-generation#transparency)もありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8fb15863-2123-4e22-b30d-df64f0714293.png)

そこに掲載されているコードサンプルは、以下のとおりです。

```javascript
import OpenAI from "openai";
import fs from "fs";
const openai = new OpenAI();

const result = await openai.images.generate({
    model: "gpt-image-1",
    prompt: "Draw a 2D pixel art style sprite sheet of a tabby gray cat",
    size: "1024x1024",
    background: "transparent",
    quality: "high",
});

// Save the image to a file
const image_base64 = result.data[0].b64_json;
const image_bytes = Buffer.from(image_base64, "base64");
fs.writeFileSync("sprite.png", image_bytes);
```

上記の中で、以下の部分で背景透過を指定しています。
その前後は、画像のサイズ・画像品質を指定するオプションのようです。

```javascript
    size: "1024x1024",
    background: "transparent",
    quality: "high",
```


### API を試してみる： 公式サンプル通り

それでは「GPT Image API（gpt-image-1）」を実際に試していきます。


#### 過去に使っていたライブラリのアップデート

今回、[ちょっと前に API を試した時（o3・o4-mini を試した時）](https://qiita.com/youtoy/items/88f7b8deaf782fdd6a23)の環境を再利用することにました。

`npm outdated` でライブラリのバージョンを確認したところ、最新版が出ていたので `npm update` で[公式の TypeScript・JavaScript ライブラリ](https://www.npmjs.com/package/openai
)をアップデートしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/005e98ad-d457-4fda-af0a-133f112abba8.png)

#### APIキーの準備

あと OpenAI の APIキーを、環境変数「OPENAI_API_KEY」として使えるようにしておきます。

#### 公式サンプル通りのお試し

まずは、上記の公式サンプル 2つをそのまま試してみました。

その結果、1つ目のお試しで以下の左側の画像が、2つ目のお試しで右側の画像を得ることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6ae14f81-1905-4ca6-9416-ea8f685d99a5.png)



### API を試してみる： その2

プロンプトを変更した内容で試してみます。

#### シンプルな画像生成

最初に試した 2つのうち、1つ目にあたる画像生成です。

基本的にプロンプトを書きかえただけという内容ですが、以下のコードを使いました。

```javascript
import OpenAI from "openai";
import fs from "fs";
const openai = new OpenAI();

const prompt = `
炎のドラゴンと氷のドラゴンが、闇の世界の城で
戦っている様子のファンタジー世界のピクセルアート
`;

const result = await openai.images.generate({
  model: "gpt-image-1",
  prompt,
});

const image_base64 = result.data[0].b64_json;
const image_bytes = Buffer.from(image_base64, "base64");
fs.writeFileSync("ピクセルアート.png", image_bytes);
```

上記を 2回実行してみて、それぞれ得られた画像は以下のとおりです。

https://x.com/youtoy/status/1915368392468599247
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9c069390-fdea-4c37-b76f-e315e266c902.png)

似てはいますが、異なる内容のものを得られました。


#### 背景透過のスプライト

最初に試した 2つのうち、2つ目にあたる画像生成です。

また今度も、基本的にプロンプトを書きかえただけという内容ですが、以下のコードを使いました。

```javascript
import OpenAI from "openai";
import fs from "fs";
const openai = new OpenAI();

const prompt = `
2Dのピクセルアートのスプライトシートを作って。
絵柄は剣と盾を持って、ローブを身にまとった勇者。
`;

const result = await openai.images.generate({
  model: "gpt-image-1",
  prompt: prompt,
  size: "1024x1024",
  background: "transparent",
  quality: "high",
});

const image_base64 = result.data[0].b64_json;
const image_bytes = Buffer.from(image_base64, "base64");
fs.writeFileSync("スプライト画像.png", image_bytes);
```

そして、得られた結果は以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0549ac92-fbff-4dca-9edb-36ac1b6696ad.png)

「剣と盾を持って、ローブを身にまとった」という内容を満たしたものが出てきました。
（そもそも、このプロンプトでの見た目の指定だと、勇者っぽさの有無は判断できない感じかと思うので、そこは気にしないことにしました）


最初のサンプル通りのコードで試した時と比べると、スプライトシート内の画像の数にかなりの違いが出ました。
このあたりは指定をしていなかったので、きちんと指定してやればコントロールができそうな部分かとは思われます。


## API の利用履歴を確認してみる

以下の API利用履歴が見られるページで、今回のお試し後の状態を見てみました（記事内で書いた内容以外でも、API を少し使っています）。

https://platform.openai.com/usage/chat-completions

その結果、以下のように「gpt-image-1-2025-04-23」の利用履歴が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/efa5a4ee-8ea8-4be2-8b05-fafc2026ea97.png)




## おわりに

今回、OpenAI の新API「GPT Image API（モデル： gpt-image-1）」を使って、画像生成を試しました。

今の内容だと API ならではという要素がないので、API経由での利用という部分を活用した内容も試せればと思います。



## 「API Organization Verification」について

今回使った「GPT Image API（gpt-image-1）」を利用する場合、[前に記事に書いていた「API Organization Verification」](https://qiita.com/youtoy/items/7e7807d7af704154eb67)が必要になりそうでした。

それを進めた話を少しだけ書いておきます。

### API Organization Verification を進めた話

#### 支払い方法の設定

API Organization Verification に関するボタンを押すと、最初は支払い方法に関するデフォルト支払い設定を行うよう促されました。

![490715896_1181036063350412_9129830304339212043_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/681ed62c-582e-4f63-b9d2-4d76dd63b065.jpeg)

既に、過去の API課金などに使った支払い方法はアカウントに登録されていたのですが、デフォルトの支払い方法の設定がされておらず、これを行うように促されたようです。

これは、登録済みだった支払い情報を、デフォルトの支払い方法として設定するだけで終わりました。

#### 本人確認

次は本人確認で、以下のように外部サービスを使った手順を進めるよう促されます。

![491009016_3174955069322037_2523055519937471603_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/835e5394-ebe1-4c2a-add1-9c7e47d4edc4.jpeg)

以下のサービスを使う形でした。

![486567157_485091777931355_871257015233634601_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4451be33-f791-4b39-a62d-ccfa0f2bd75d.jpeg)

この後は、免許証・パスポート・マイナンバーカードなど、指定された本人確認書類のうちの 1つを使った確認と、カメラを使った確認（顔をうつして、指定された方向に顔を動かすという方法のもの）を進めました。

自分は、運転免許証を使った確認を選んで進めました。

#### 本人確認完了

その後、以下のように認証完了となりました。

![491133642_673870222021184_5336426388646582643_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d5764026-f6e1-49cd-a14e-e3041e390a55.jpeg)