0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

まだPhotoshopで一枚一枚手作業で画像を直してるの?PythonとNano Banana APIを使って、一気に処理しちゃう方法があるよ!

Posted at

こんなんどかしいこと、あったことない?

商品の画像がたくさんあるのに、値段とかキャンペーンの文字が変わっちゃって…。Photoshopで一枚ずつ開いて、文字のレイヤーを探して、そーっと直して、名前つけて保存…。10枚くらいやっただけで、もう頭ん中がグルグルしちゃうよね。時間かかるし、しかもミスしやすいって、最悪な組み合わせ。うっかり一個でも修正し忘れてたら、もう見てられないもんね。

昔は、こんな感じでやってたよね:

  1. まずPhotoshopを立ち上げて…
  2. 画像を読み込んで…
  3. 文字のレイヤーを探し出して…
  4. テキストを書き換えて…
  5. 画像を書きだして…
  6. これを、えんえんと繰り返すの…

数十枚、数百枚の画像が目の前にあったら、正真正銘、肉体労働だよ。

でも今は、こうできる:

  1. Pythonのスクリプトを一個、ポチッと実行。
  2. コーヒーでも飲んで、スマホいじってるあいだに…
  3. すべての画像が勝手に修正されて、フォルダの中にスッキリ保存されてる。

この間に起こる魔法、それが今回紹介したい主役、AIによる画像編集機能ってわけです。

主役のツール:Nano Banana API

ざっくり言うと、**Nano Banana API**っていうのは、めちゃくちゃパワフルなAIツールでして、デザイナーさんに「こうやって」ってお願いするみたいに、テキストで簡単な説明を書くだけで、画像の中身を直接いじれるんです。

「この画像の『¥19.9』ってところを『¥9.9』に変えて」って言うだけで、AIが意味をわかって修正してくれるってすごいでしょ?

準備:たったの3ステップだから安心してね

大丈夫、準備は超カンタン。3分もかかりませんよ。

  1. Pythonをインストールしよう:お使いのパソコンにPython 3が入ってるか、まずチェックしてみてね。
  2. ライブラリをインストールしよう:必要なのは、Webにリクエストを送るためのrequestsライブラリだけ。ターミナルかコマンドプロンプトで、下のコマンドを叩いてみてください。
    pip install requests
    
  3. APIキーをゲットしよう:APIを提供しているサイトでアカウント登録をして、APIキーを手に入れます。これがサービスを呼び出すための「合言葉」みたいなものです。

これで準備はバッチリ!めちゃくちゃ簡単じゃない?

実践編:コピペするだけで使える完成版コード

ってことで、ここに完成版のPythonスクリプトを用意してみました。YOUR_API_KEYって書いてあるところを、ご自身のキーに差し替えて、画像のURLとプロンプト(指示文)を修正したら、もうすぐに実行できちゃいます。

コードの中には、どうやってAPIを使うのかがよくわかるように、詳しいコメントもつけておきましたよ。

import requests
import time
import json

# --- 1. 準備:APIキーとURLを設定 ---
# ここは自分のAPIキーに書き換えてね
API_KEY = "YOUR_API_KEY" 
# APIのベースURL(公式ドキュメントで確認してね)
BASE_URL = "https://api.defapi.org" 
# 認証用のヘッダー。ドキュメントだと "Bearer <your-api-key>"って書式だよ
headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

def edit_image_with_text(image_url: str, prompt: str):
    """
    Nano Banana APIを使って、テキストの指示で画像を編集する関数です。
    
    :param image_url: 編集したい画像のURL
    :param prompt: 編集内容の指示(例:「画像の価格ラベルを99円に変更」)
    :return: 編集後の画像のURL。失敗したときはNoneを返すよ
    """
    print(f"🚀 画像処理をスタートします: {image_url}")
    print(f"📝 編集の指示: {prompt}")

    # --- 2. 画像編集のタスクを依頼する ---
    # タスクを作るためのAPIのURL
    gen_url = f"{BASE_URL}/api/image/gen"
    
    # AIに何をしてほしいかを伝えるためのデータを作成
    # model: "google/nano-banana"というモデルを使うよ
    # prompt: 編集の指示
    # images: 元の画像のURLをリスト形式で指定(最大4枚)。今回は1枚だけ
    payload = {
        "model": "google/nano-banana",
        "prompt": prompt,
        "images": [image_url]
    }

    try:
        # POSTリクエストを送って、非同期のタスクを作成
        response = requests.post(gen_url, headers=headers, json=payload)
        response.raise_for_status()  # もしリクエストが失敗したら(例:401, 400)、エラーを出すようにする
        
        # レスポンスからtask_idを取得。これがタスクの状況を追いかけるための唯一のID
        task_id = response.json().get("data", {}).get("task_id")
        if not task_id:
            print("❌ エラー:task_idが取得できませんでした")
            return None
            
        print(f"✅ タスクの作成、成功!タスクID: {task_id}")

        # --- 3. タスクの結果を定期的に確認しに行く ---
        # タスクの状況をチェックするAPIのURL
        query_url = f"{BASE_URL}/api/task/query"
        
        # タスクが成功するか失敗するまでループして確認
        while True:
            # task_idをパラメータにつけてGETリクエストを送信
            params = {"task_id": task_id}
            query_response = requests.get(query_url, headers=headers, params=params)
            query_response.raise_for_status()
            
            result_data = query_response.json().get("data", {})
            status = result_data.get("status")
            
            print(f"⏳ 今のタスク状況: {status}...")
            
            if status == "success":
                # タスク成功!resultフィールドから編集後の画像URLを取得
                edited_image_url = result_data.get("result", [{}])[0].get("image")
                print(f"🎉 画像の編集が完了しました!新しい画像のURL: {edited_image_url}")
                return edited_image_url
            elif status == "failed":
                # タスク失敗。失敗した理由を表示
                reason = result_data.get("status_reason", {}).get("message", "原因不明のエラー")
                print(f"❌ タスクが失敗しちゃいました: {reason}")
                return None
            else:
                # タスクまだ進行中(例:in_progress, pending)なので、5秒待ってもう一度
                time.sleep(5)

    except requests.exceptions.RequestException as e:
        print(f"❌ ネットワークのリクエストでエラーが発生しました: {e}")
        return None
    except json.JSONDecodeError:
        print("❌ APIからの返答を解析できませんでした。ちゃんとしたJSON形式じゃないみたい。")
        return None


if __name__ == "__main__":
    # --- ここで画像と指示をカスタマイズしてね ---
    # サンプル画像:値札がついた商品の画像
    target_image_url = "https://cdn.openai.com/API/docs/images/body-lotion.png"
    # サンプル指示:価格を新しい値に変更
    modification_prompt = "Change the price text on the bottle to $9.99"
    
    # 関数を呼び出して一括処理を開始(今回は例として1枚だけ)
    # 画像URLのリストを作ってループさせれば、本当の一括処理もできるよ
    final_image_url = edit_image_with_text(target_image_url, modification_prompt)
    
    if final_image_url:
        print("\n処理が完了しました。上のURLにアクセスして結果を確認してみてください。")
    else:
        print("\n処理は終わったけど、編集後の画像の取得に失敗しました。")

使い方ガイド

  1. コードを保存しよう:上のコードをbatch_edit.pyみたいな名前で、Pythonファイルとして保存します。
  2. キーを入れようAPI_KEY = "YOUR_API_KEY"っていう行を探して、YOUR_API_KEYを自分の実際のキーに書き換えてください。
  3. 画像と指示を決めようif __name__ == "__main__":って書いてあるあたりで、target_image_urlmodification_promptっていう2つの変数を編集します。
  4. スクリプトを走らせよう:ターミナルでpython batch_edit.pyって実行します。

あとは、ターミナルに処理の状況がリアルタイムで表示されるのを、ぼーっと見てるだけです。もし一気に処理したいなら、画像のURLとそれに対応する指示をリストにして、edit_image_with_text関数をループで呼び出せばOKです。

これでもう、面倒な単純作業の地獄から解放されるってわけ!さっそく試してみようよ!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?