Spaces:
Sleeping
Sleeping
import os | |
import io | |
import tempfile | |
from datetime import datetime | |
import PIL.Image | |
from google import genai | |
from google.genai import types | |
import httpx | |
from imgurpython import ImgurClient | |
genai_client = genai.Client(api_key=os.environ["GOOGLE_API_KEY"]) | |
class Image_text_Generator: | |
def __init__(self, imgur): | |
# 初始化 Imgur 客戶端 | |
self.imgur_client = imgur | |
def generate_image_with_gemini(self, prompt): | |
""" | |
使用 Gemini 模型生成圖片。 | |
參數: | |
prompt (str): 用於生成圖片的提示詞。 | |
返回: | |
bytes: 生成的圖片的二進位資料,如果生成失敗則返回 None。 | |
""" | |
response = 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 | |
def generate_txt_with_gemini(self, prompt,doc_url): | |
doc_data = httpx.get(doc_url).content | |
response = client.models.generate_content( | |
model="gemini-1.5-flash", | |
contents=[ | |
types.Part.from_bytes(data=doc_data, mime_type='application/pdf',),prompt] | |
) | |
return response.text | |