# pip install google-genai gradio pillow import base64 import mimetypes import os import io import gradio as gr from google import genai from google.genai import types from PIL import Image import tempfile class GeminiImageGenerator: def __init__(self): self.client = None self.model = "gemini-2.5-flash-image-preview" def set_api_key(self, api_key): """API anahtarını ayarla""" try: os.environ["GEMINI_API_KEY"] = api_key self.client = genai.Client(api_key=api_key) return "✅ API anahtarı başarıyla ayarlandı!" except Exception as e: return f"❌ API anahtarı ayarlanırken hata: {str(e)}" def generate_image(self, prompt, api_key): """Görsel oluştur""" if not api_key: return None, "❌ Lütfen önce API anahtarınızı girin!" if not prompt.strip(): return None, "❌ Lütfen bir görsel açıklaması girin!" try: # API anahtarını ayarla if not self.client or os.environ.get("GEMINI_API_KEY") != api_key: self.client = genai.Client(api_key=api_key) os.environ["GEMINI_API_KEY"] = api_key # İçerik oluştur contents = [ types.Content( role="user", parts=[ types.Part.from_text(text=f"Generate an image of: {prompt}"), ], ), ] generate_content_config = types.GenerateContentConfig( response_modalities=[ "IMAGE", "TEXT", ], ) # Stream'den veri al image_data = None text_response = "" for chunk in self.client.models.generate_content_stream( model=self.model, contents=contents, config=generate_content_config, ): if ( chunk.candidates is None or chunk.candidates[0].content is None or chunk.candidates[0].content.parts is None ): continue # Görsel verisi varsa al if (chunk.candidates[0].content.parts[0].inline_data and chunk.candidates[0].content.parts[0].inline_data.data): inline_data = chunk.candidates[0].content.parts[0].inline_data image_data = inline_data.data # Metin yanıtı varsa al if hasattr(chunk, 'text') and chunk.text: text_response += chunk.text if image_data: # Görsel verisini PIL Image'e çevir image = Image.open(io.BytesIO(image_data)) success_msg = f"✅ Görsel başarıyla oluşturuldu!\n\nAçıklama: {prompt}" if text_response: success_msg += f"\n\nGemini'nin yorumu: {text_response}" return image, success_msg else: return None, f"❌ Görsel oluşturulamadı. Yanıt: {text_response}" except Exception as e: return None, f"❌ Hata oluştu: {str(e)}" def save_image(self, image, filename): """Görseli kaydet""" if image is None: return "❌ Kaydedilecek görsel yok!" try: if not filename.strip(): filename = "generated_image.png" if not filename.endswith(('.png', '.jpg', '.jpeg')): filename += '.png' image.save(filename) return f"✅ Görsel '{filename}' olarak kaydedildi!" except Exception as e: return f"❌ Kaydetme hatası: {str(e)}" # Generator instance generator = GeminiImageGenerator() def generate_and_display(prompt, api_key): """Görsel oluştur ve göster""" return generator.generate_image(prompt, api_key) def save_current_image(image, filename): """Mevcut görseli kaydet""" return generator.save_image(image, filename) # Gradio arayüzü with gr.Blocks( theme=gr.themes.Soft(), title="Gemini Görsel Oluşturucu", css=""" .main-container { max-width: 1200px; margin: 0 auto; } .header { text-align: center; padding: 20px 0; background: linear-gradient(45deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px; margin-bottom: 20px; } .generate-btn { background: linear-gradient(45deg, #667eea 0%, #764ba2 100%) !important; border: none !important; color: white !important; } """ ) as demo: gr.HTML("""

🎨 Gemini Görsel Oluşturucu

Google Gemini AI ile yaratıcı görseller oluşturun

""") with gr.Row(): with gr.Column(scale=1): # API Key girişi api_key_input = gr.Textbox( label="🔑 Gemini API Anahtarı", placeholder="API anahtarınızı buraya girin...", type="password", info="Google AI Studio'dan alacağınız API anahtarını girin" ) # Prompt girişi prompt_input = gr.Textbox( label="📝 Görsel Açıklaması", placeholder="Örnek: Bir kedi astronot uzayda yüzüyor", lines=3, info="Oluşturmak istediğiniz görseli detaylı olarak açıklayın" ) # Örnek promptlar gr.Examples( examples=[ ["Bir kedi astronot uzayda yüzüyor"], ["Cyberpunk tarzında neon şehir manzarası"], ["Sihirli orman içinde parlayan mantarlar"], ["Vintage tarzda robot kahve içiyor"], ["Underwater saray balıklar arasında"], ["Steampunk tarzında uçan makine"], ], inputs=prompt_input, label="💡 Örnek Promptlar" ) # Oluştur butonu generate_btn = gr.Button( "🎨 Görsel Oluştur", variant="primary", elem_classes=["generate-btn"], scale=1 ) # Kaydetme bölümü gr.Markdown("### 💾 Görseli Kaydet") filename_input = gr.Textbox( label="Dosya Adı", placeholder="ornek_gorsel.png", value="generated_image.png" ) save_btn = gr.Button("💾 Kaydet", variant="secondary") with gr.Column(scale=2): # Görsel çıktısı image_output = gr.Image( label="🖼️ Oluşturulan Görsel", type="pil", height=500 ) # Durum mesajı status_output = gr.Textbox( label="📊 Durum", lines=4, interactive=False ) # Kaydetme durumu save_status = gr.Textbox( label="💾 Kaydetme Durumu", lines=2, interactive=False ) # Event handlers generate_btn.click( fn=generate_and_display, inputs=[prompt_input, api_key_input], outputs=[image_output, status_output] ) save_btn.click( fn=save_current_image, inputs=[image_output, filename_input], outputs=[save_status] ) # Enter tuşu ile oluşturma prompt_input.submit( fn=generate_and_display, inputs=[prompt_input, api_key_input], outputs=[image_output, status_output] ) # Kullanım talimatları gr.Markdown(""" ## 📖 Kullanım Talimatları 1. **API Anahtarı**: Google AI Studio'dan Gemini API anahtarınızı alın ve yukarıdaki alana girin 2. **Prompt**: Oluşturmak istediğiniz görseli detaylı olarak açıklayın 3. **Oluştur**: "Görsel Oluştur" butonuna tıklayın veya Enter'a basın 4. **Kaydet**: Beğendiğiniz görseli bilgisayarınıza kaydedin ### 💡 İpuçları - Detaylı açıklamalar daha iyi sonuçlar verir - Sanat tarzı belirtin (cyberpunk, vintage, anime, vb.) - Renk paletini ve atmosferi tanımlayın - Örnek promptları deneyerek başlayabilirsiniz ### 🔗 Faydalı Linkler - [Google AI Studio](https://makersuite.google.com/app/apikey) - API anahtarı almak için - [Gemini API Dökümantasyonu](https://ai.google.dev/docs) """) if __name__ == "__main__": demo.launch( server_name="0.0.0.0", server_port=7860, share=True, debug=True )