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))) | |