Spaces:
Runtime error
Runtime error
File size: 6,207 Bytes
ba5b50e | 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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | import gradio as gr
from PIL import Image
import cv2
import numpy as np
import os
from google import genai
from google.genai import types
import io
# ====================== GEMINI API AYARLARI ======================
# Google AI Studio'dan API key al: https://aistudio.google.com/app/apikey
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") # Hugging Face Secrets'e ekle veya .env kullan
client = genai.Client(api_key=GEMINI_API_KEY) if GEMINI_API_KEY else None
# ====================== KLASİK FİLTRELER ======================
def apply_classic_filter(image, filter_name, intensity=1.0):
img = np.array(image)
if filter_name == "Orijinal":
return image
elif filter_name == "Siyah-Beyaz":
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
return Image.fromarray(cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB))
elif filter_name == "Sepya":
sepia = np.array([[0.393, 0.769, 0.189], [0.349, 0.686, 0.168], [0.272, 0.534, 0.131]])
img_sepia = cv2.transform(img, sepia)
img_sepia = np.clip(img_sepia, 0, 255).astype(np.uint8)
return Image.fromarray(img_sepia)
elif filter_name == "Vintage":
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
img = cv2.addWeighted(img, 0.8, cv2.GaussianBlur(img, (15,15), 0), 0.2, 0)
return Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
elif filter_name == "Cartoon":
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
gray = cv2.medianBlur(gray, 5)
edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9)
color = cv2.bilateralFilter(img, 9, 300, 300)
cartoon = cv2.bitwise_and(color, color, mask=edges)
return Image.fromarray(cartoon)
elif filter_name == "Pencil Sketch":
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
invert = cv2.bitwise_not(gray)
blur = cv2.GaussianBlur(invert, (21, 21), 0)
sketch = cv2.divide(gray, blur, scale=256.0)
return Image.fromarray(sketch)
elif filter_name == "Beauty / Glow":
img_pil = Image.fromarray(img)
img_pil = ImageEnhance.Brightness(img_pil).enhance(1.2)
img_pil = ImageEnhance.Contrast(img_pil).enhance(1.3)
img_pil = ImageEnhance.Sharpness(img_pil).enhance(1.5)
return img_pil
# ... diğer filtreleri istersen ekleyebilirim
return image
# ====================== NANO BANANA 2 GERÇEK API ======================
def apply_nano_banana_2(image: Image.Image, prompt: str):
if not client:
return Image.new("RGB", (512, 512), color="red") # API key yok uyarısı
if not prompt.strip():
prompt = "Bu fotoğrafı daha güzel ve profesyonel hale getir, doğal ışık ve detayları artır"
try:
# Resmi bytes olarak hazırla
img_byte_arr = io.BytesIO()
image.save(img_byte_arr, format='PNG')
img_byte_arr = img_byte_arr.getvalue()
# Gemini Nano Banana 2 (gemini-3.1-flash-image-preview) ile düzenleme
response = client.models.generate_content(
model="gemini-3.1-flash-image-preview", # Nano Banana 2
contents=[
types.Content(
role="user",
parts=[
types.Part.from_bytes(data=img_byte_arr, mime_type="image/png"),
types.Part.from_text(text=prompt)
]
)
]
)
# Yanıttan üretilen resmi al
for part in response.candidates[0].content.parts:
if part.inline_data:
generated_image = Image.open(io.BytesIO(part.inline_data.data))
return generated_image
return image # fallback
except Exception as e:
print("Nano Banana 2 Error:", str(e))
# Hata durumunda basit bir efekt ver
return ImageEnhance.Contrast(image).enhance(1.4)
# ====================== ANA FONKSİYON ======================
def apply_filter(image, filter_name, intensity=1.0, prompt=""):
if filter_name == "Prompt ile Düzenle (Nano Banana 2)":
return apply_nano_banana_2(image, prompt)
else:
return apply_classic_filter(image, filter_name, intensity)
# ====================== GRADIO ARAYÜZ ======================
with gr.Blocks(title="📸 Foto Filter + Nano Banana 2", theme=gr.themes.Soft()) as demo:
gr.Markdown("# 📸 Foto Filter + **Gerçek Nano Banana 2** Entegrasyonu\n"
"Artık 'Prompt ile Düzenle' seçeneğinde **Google Gemini 3.1 Flash Image (Nano Banana 2)** kullanıyor!")
with gr.Row():
with gr.Column():
input_image = gr.Image(type="pil", label="📤 Fotoğraf Yükle", height=550)
filter_choice = gr.Dropdown(
choices=[
"Orijinal", "Siyah-Beyaz", "Sepya", "Vintage", "Cartoon",
"Pencil Sketch", "Beauty / Glow",
"Prompt ile Düzenle (Nano Banana 2)"
],
value="Orijinal",
label="🎨 Filtre / Efekt Seç"
)
intensity = gr.Slider(0.5, 2.0, value=1.0, step=0.1, label="Klasik Filtre Yoğunluğu", visible=True)
prompt = gr.Textbox(
label="✍️ Düzenleme Talimatı (Nano Banana 2 için)",
placeholder="Örnek: 'Bu kişiyi plajda gün batımında göster', 'karikatür tarzı yap', 'profesyonel portre efekti ver'",
lines=2
)
btn = gr.Button("🚀 Uygula", variant="primary", size="large")
with gr.Column():
output_image = gr.Image(type="pil", label="📥 Sonuç", height=550)
gr.Markdown("""
### 💡 Nasıl Kullanılır?
1. Google AI Studio’dan ücretsiz API Key al → [aistudio.google.com/app/apikey](https://aistudio.google.com/app/apikey)
2. Hugging Face Space’te **Secrets** kısmına `GEMINI_API_KEY` adıyla ekle
3. "Prompt ile Düzenle (Nano Banana 2)" seçeneğini kullan
""")
btn.click(
fn=apply_filter,
inputs=[input_image, filter_choice, intensity, prompt],
outputs=output_image
)
if __name__ == "__main__":
demo.launch() |