【NodeJS】Geminiを使った画像生成(Nano Banana)

Node.js

1. 概要

前回は自作MCP(Model Context Protocol)サーバーをGemini CLIと連携して使ってみる内容についてでした。今回はGemini 2.5 Flash Image (Nano Banana)を使って画像を生成する内容になります。

対象としては開発を1年程やってて自分で最初から開発してみたい方になります。そのため細かい用語などの説明はしません。

2. nodeのインストール

こちらを参考

3. プロジェクトを作成

mkdir nano-banana-test
cd nano-banana-test
npm init
npm i -D typescript @types/node ts-node nodemon dotenv
npx tsc --init

※Gemini API キーが必要です。キーがない場合は、Google AI Studio で無料で取得できます。

4. 必要なライブラリをインストール

npm install @google/genai

5. ソースコード

5-1. package.json

{
  "name": "nano-banana-test",
  "version": "1.0.0",
  "description": "",
  "license": "ISC",
  "author": "",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "dev": "tsc && NODE_ENV=dev node dist/index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "devDependencies": {
    "@types/node": "^24.5.2",
    "dotenv": "^17.2.2",
    "nodemon": "^3.1.10",
    "ts-node": "^10.9.2",
    "typescript": "^5.9.2"
  },
  "dependencies": {
    "@google/genai": "^1.21.0"
  }
}

5-2. tsconfig.json

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "verbatimModuleSyntax": true,
    "esModuleInterop": true,
    "strict": true,
    "outDir": "dist"
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

5-3. .env.local

GEMINI_API_KEY=******

5-4. src/env.ts

import dotenv from "dotenv";
import { fileURLToPath } from "url";
import path from "path";

export const __dirname = path.dirname(fileURLToPath(import.meta.url));

export const loadEnv = async () => {
  if (process.env.NODE_ENV === "dev") {
    console.log(`This is dev environment.`);
    dotenv.config({ path: [".env.local"] });
  }
};

5-5. src/index.ts

import { loadEnv } from "./env.js";
import {
  GenerateContentResponse,
  GoogleGenAI,
  type Candidate,
} from "@google/genai";
import * as fs from "node:fs";

const run = async () => {
  const ai = new GoogleGenAI({});

  try {
    const imgFileName = "panko-enjoying-halloween-with-gemini.png";
    const prompt =
      "こちらのPanko```https://panko.world/ja```画像ですが、ハロウィンを楽しむ感じの画像を作成してください。細かい事はお任せします。";

    const response: GenerateContentResponse = await ai.models.generateContent({
      model: "gemini-2.5-flash-image-preview",
      contents: prompt,
    });
    const candidates: Candidate[] | undefined = response.candidates;
    if (!candidates || candidates.length === 0) {
      console.log("No candidates found in the response.");
      return;
    }
    for (const part of candidates[0].content?.parts!) {
      if (part.text) {
        console.log(part.text);
      } else if (part.inlineData) {
        const imageData: string | undefined = part.inlineData.data;
        if (!imageData) {
          console.log("No image data found in the response.");
          return;
        }
        const buffer = Buffer.from(imageData, "base64");
        fs.writeFileSync(imgFileName, buffer);
        console.log(`Image saved as ${imgFileName}`);
      }
    }
  } catch (error) {
    console.error("API呼び出し中にエラーが発生しました:", error);
    throw error;
  }
};

const main = async () => {
  await loadEnv();
  await run();
};

await main().catch((err) => {
  console.error("アプリケーションの実行に失敗しました:", err);
  process.exit(1);
});

6. 実行

npm run dev
> nano-banana-test@1.0.0 dev
> tsc && NODE_ENV=dev node dist/index.js

This is dev environment.
[dotenv@17.2.2] injecting env (1) from .env.local -- tip: ⚙️  suppress all logs with { quiet: true }
はい、承知いたしました。Pankoがハロウィンを楽しんでいる画像を生成しますね!細かいところはお任せください。

Image saved as panko-enjoying-halloween-with-gemini.png

  • プロンプト
こちらのPanko```https://panko.world/ja```画像ですが、ハロウィンを楽しむ感じの画像を作成してください。細かい事はお任せします。
  • 生成画像

7. ディレクトリの構造

.
├── dist
│   ├── env.js
│   └── index.js
├── package-lock.json
├── package.json
├── panko-enjoying-halloween-with-gemini.png
├── src
│   ├── env.ts
│   └── index.ts
└── tsconfig.json

2 directories, 8 files

8. 備考

今回はGemini 2.5 Flash Image (Nano Banana)を使って画像を生成する内容でした。

9. 参考

投稿者プロフィール

Sondon
開発好きなシステムエンジニアです。
卓球にハマってます。

関連記事

  1. Node.js

    【NodeJS】Crawleeを使ってみる(Scraping with…

  2. Node.js

    【NodeJS】Gemini APIを使ってみる

  3. Node.js

    【NodeJS】PrismaやTypeScript、MySQLを使って…

  4. Node.jsバージョン管理ツールについて調べてみる

  5. Node.js

    【NodeJS】TypeScriptでCSVを読み込んで処理する

  6. Node.js

    【NodeJS】自作MCPサーバー with Gemini CLI

最近の記事

制作実績一覧

  1. Checkeys