2025年9月14日日曜日

NanoBananaのAPIを使って4コマ漫画を描いてもらった

NanoBananaのAPIを使って4コマ漫画を描いてもらった

概要

前回 NanoBanana に4コマ漫画を描いてもらいました
今回は API を使って描いてもらいました
なお Google AI Studio からは無料で使えますが API は有料なのでご注意ください
料金はだいたい1回で6円くらいです

環境

  • NanoBanana
    • Google AI Studio 2025/09/10 時点
  • Python 3.12.11
    • google-genai 1.36.0

サンプルコード

参照画像を配置するディレクトリなどは適宜変更してください
複数画像のアップロードに対応していますがその分料金もかかります

import argparse
from io import BytesIO

from google.genai.client import Client
from google.genai.types import GenerateContentResponse
from PIL import Image


class NanoBananaClient:
    API_KEY = "xxx"
    MODEL = "gemini-2.5-flash-image-preview"

    response: GenerateContentResponse
    client: Client

    def __init__(self) -> None:
        self.client = Client(api_key=self.API_KEY)

    def run(self, prompt: str):
        # チャットを作成
        chat = self.client.chats.create(model=self.MODEL)
        # プロンプトと複数画像を渡す
        self.response = chat.send_message([prompt] + self.__open_images())
        # 結果を保存する
        self.__save()

    def __open_images(self) -> list:
        # 複数の画像を開く
        image_files = ["4panel.png", "reforg.jpeg"]
        # ref1.pngからref7.pngまでのファイルをimage_filesリストに追加
        for num in range(1, 8):
            image_files.append(f"ref{num}.png")
        images = [Image.open(f"nanobanana/{path}") for path in image_files]
        return images

    def __save(self):
        # 結果の保存
        if self.response.candidates is None:
            raise RuntimeError("No candidates returned")
        if self.response.candidates[0].content is None:
            raise RuntimeError("No content returned")
        parts = self.response.candidates[0].content.parts
        if parts is not None:
            for i, part in enumerate(parts):
                if part.text is not None:
                    # テキスト情報は標準出力
                    print(part.text)
                elif part.inline_data is not None and part.inline_data.data is not None:
                    # イメージはローカルに保存
                    image = Image.open(BytesIO(part.inline_data.data))
                    image.save(f"generated_image_{i}.png")


class NanoBananaPrompt:
    thema: str

    def __init__(self, thema: str = "AIと人間の共存") -> None:
        self.thema = thema

    def create(self) -> str:
        prompt = f"""
        4コマ漫画を描いてください。4コマ漫画のテーマは「{self.thema}」です。
        4コマの配置は4panel.pngを参考にしてください。
        各コマに登場させる人物はref1.pngからref7.pngまでの画像とreforg.jpegを参考にしてください。
        各コマには吹き出しを使って日本語のセリフを入れてください。
        各コマの背景はテーマに沿ったものにしてください。
        """
        return prompt


def main():
    parser = argparse.ArgumentParser(description="4コマ漫画生成スクリプト")
    parser.add_argument("thema", type=str, help="4コマ漫画のテーマ")
    args = parser.parse_args()

    nbp = NanoBananaPrompt(args.thema)
    prompt = nbp.create()
    print(prompt)
    nbc = NanoBananaClient()
    nbc.run(prompt)


if __name__ == "__main__":
    main()

生成された画像は以下です

最後に

NanoBanana の API を使って画像を生成してみました
大量生成したい場合にはやはり API になるかなと思います

再度注意ですが Google AI Studio では無料ですが Gemini API (NanoBanana) は有料です
また NanoBanana は無料枠もないのでいきなり課金となるのでそれも注意してください

参考サイト

0 件のコメント:

コメントを投稿