File size: 2,849 Bytes
35992f9
 
4911caa
35992f9
31c7c46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35992f9
31c7c46
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import os
import io
import tempfile
from datetime import datetime
import PIL.Image
import google.generativeai as genai
from google.generativeai import types
from imgurpython import ImgurClient

class ImageGenerator:
    def __init__(self, google_api_key, imgur_client_id, imgur_client_secret, imgur_access_token, imgur_refresh_token):
        # 初始化 Gemini 客戶端
        self.genai_client = genai.Client(api_key=google_api_key)
        # 初始化 Imgur 客戶端
        self.imgur_client = ImgurClient(imgur_client_id, imgur_client_secret, imgur_access_token, imgur_refresh_token)

    def generate_image_with_gemini(self, prompt):
        """
        使用 Gemini 模型生成圖片。

        參數:
        prompt (str): 用於生成圖片的提示詞。

        返回:
        bytes: 生成的圖片的二進位資料,如果生成失敗則返回 None。
        """
        response = self.genai_client.models.generate_content(
            model="gemini-2.0-flash-exp-image-generation",
            contents=prompt,
            config=types.GenerateContentConfig(response_modalities=['Text', 'Image'])
        )

        for part in response.candidates[0].content.parts:
            if part.text is not None:
                print(part.text)
            elif part.inline_data is not None:
                return part.inline_data.data
        return None

    def upload_image_to_imgur(self, image_binary, album=None, name="gemini-image", title="Gemini Generated Image"):
        """
        將圖片上傳到 Imgur。

        參數:
        image_binary (bytes): 要上傳的圖片的二進位資料。
        album (str): 要上傳到的相簿 ID,預設為 None。
        name (str): 圖片的名稱,預設為 "gemini-image"。
        title (str): 圖片的標題,預設為 "Gemini Generated Image"。

        返回:
        str: 上傳後的圖片 URL,如果上傳失敗則返回 None。
        """
        try:
            # 將二進位資料轉換為 PIL Image
            image = PIL.Image.open(io.BytesIO(image_binary))

            # 建立暫存檔案以便上傳
            with tempfile.NamedTemporaryFile(suffix=".png", delete=True) as tmp:
                image.save(tmp.name, format='PNG')

                # 準備上傳資訊
                config = {
                    'album': album,
                    'name': name,
                    'title': title,
                    'description': f'Generated by Gemini - {datetime.now()}'
                }

                # 使用 Imgur 客戶端上傳圖片
                uploaded_image = self.imgur_client.upload_from_path(tmp.name, config=config, anon=False)

            # 返回圖片的連結
            return uploaded_image['link']
        except Exception as e:
            print(f"圖片上傳失敗: {e}")
            return None