Spaces:
Sleeping
Sleeping
# app.py | |
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_path, top_text, bottom_text): | |
# ์๋ณธ ์ด๋ฏธ์ง ๋ก๋ | |
img = Image.open(image_path).convert("RGB") | |
w, h = img.size | |
# โ ์๋ ์บก์ ์์ฑ | |
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() | |
# โก ์๋ง์ฉ ๊ฒ์ ๋ | |
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("์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ๊ณ , ์๋จยทํ๋จ ๋ฐ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๋ฉด\n์๋ ์์ฑ๋ ์์ด ์๋ง๊ณผ ํจ๊ป ๋ฐ ์คํ์ผ ์ด๋ฏธ์ง๋ฅผ ๋ฐํํฉ๋๋ค.") | |
img_in = gr.Image(type="filepath", label="Upload Image") | |
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)) | |
) | |