Spaces:
Sleeping
Sleeping
import os | |
from PIL import Image, ImageDraw, ImageFont | |
import gradio as gr | |
from transformers import pipeline | |
# 1) μ΄λ―Έμ§ μΊ‘μ λ νμ΄νλΌμΈ | |
captioner = pipeline("image-to-text", model="Salesforce/blip-image-captioning-base") | |
# 2) λ° + μλ§ ν©μ± ν¨μ | |
def make_meme_with_subtitle(image, top_text, bottom_text): | |
if image is None: | |
raise ValueError("μ΄λ―Έμ§κ° μ λ‘λλμ§ μμμ΅λλ€.") | |
# μ΄λ―Έμ§ λ³ν | |
img = image.convert("RGB") | |
w, h = img.size | |
# β μλ μΊ‘μ μμ± | |
try: | |
out = captioner(img, max_length=40, num_beams=5) | |
raw = out[0].get("generated_text") or out[0].get("text") or "" | |
subtitle = raw.strip().capitalize() if raw else "No caption found" | |
except Exception as e: | |
subtitle = "No caption (error)" | |
# β‘ μλ§μ© κ²μ λ μμ± | |
bar_h = int(h * 0.15) | |
bar = Image.new("RGB", (w, bar_h), color="black") | |
combined_h = h + bar_h | |
combined = Image.new("RGB", (w, combined_h)) | |
combined.paste(img, (0, 0)) | |
combined.paste(bar, (0, h)) | |
draw = ImageDraw.Draw(combined) | |
# β’ μλ§ ν°νΈ μ€μ | |
try: | |
font_path = "arialbd.ttf" # μμ€ν μ ν΄λΉ ν°νΈκ° μμ κ²½μ° μ€λ₯ | |
base_font_size = int(bar_h * 0.5) | |
font = ImageFont.truetype(font_path, size=base_font_size) | |
except: | |
font = ImageFont.load_default() | |
# β£ μλ§ κ·Έλ¦¬κΈ° (νλ¨ μ€μ) | |
tw, th = draw.textsize(subtitle, font=font) | |
tx = (w - tw) // 2 | |
ty = h + (bar_h - th) // 2 | |
draw.text((tx, ty), subtitle, font=font, fill="white") | |
# β€ λ° ν μ€νΈ ν°νΈ μ€μ | |
meme_font_size = int(h * 0.07) | |
try: | |
meme_font = ImageFont.truetype(font_path, size=meme_font_size) | |
except: | |
meme_font = ImageFont.load_default() | |
# μλ¨ ν μ€νΈ | |
if top_text: | |
text = top_text.upper() | |
tw, th = draw.textsize(text, font=meme_font) | |
draw.text(((w - tw) // 2, 10), text, font=meme_font, fill="white", stroke_width=2, stroke_fill="black") | |
# νλ¨ ν μ€νΈ (μ΄λ―Έμ§ λ΄λΆ) | |
if bottom_text: | |
text = bottom_text.upper() | |
tw, th = draw.textsize(text, font=meme_font) | |
draw.text(((w - tw) // 2, h - th - 10), text, font=meme_font, fill="white", stroke_width=2, stroke_fill="black") | |
return combined | |
# 3) Gradio UI | |
with gr.Blocks() as demo: | |
gr.Markdown("## πΈ λ° μμ± + μλ μμ΄ μλ§ ν©μ±") | |
gr.Markdown("μ΄λ―Έμ§λ₯Ό μ λ‘λνκ³ , μλ¨Β·νλ¨ λ° ν μ€νΈλ₯Ό μ λ ₯νλ©΄ μλ μμ±λ μμ΄ μλ§κ³Ό ν¨κ» λ° μ€νμΌ μ΄λ―Έμ§λ₯Ό λ°νν©λλ€.") | |
img_in = gr.Image(type="pil", label="Upload Image") # filepath β pil | |
top_txt = gr.Textbox(label="Top Text (optional)", placeholder="e.g. WHEN YOU REALIZE...", lines=1) | |
bottom_txt = gr.Textbox(label="Bottom Text (optional)", placeholder="e.g. ...IT'S MONDAY AGAIN", lines=1) | |
btn = gr.Button("Generate Meme") | |
out_img = gr.Image(label="Meme with Subtitle") | |
btn.click(fn=make_meme_with_subtitle, inputs=[img_in, top_txt, bottom_txt], outputs=out_img) | |
# 4) μ± μ€ν | |
if __name__ == "__main__": | |
demo.launch(server_name="0.0.0.0", server_port=int(os.environ.get("PORT", 7860))) | |