sf-78d / app.py
jordonpeter01's picture
Add 1 files
a340531 verified
# Import necessary libraries
from transformers import pipeline
from PIL import Image, ImageDraw, ImageFont
from gradio import Interface, Textbox, Radio, Dataframe, File, Label
# Set up Hugging Face pipeline for text-to-image
text_to_image = pipeline('text2image')
# Define UI elements
textarea = Textbox(lines=5, placeholder="Enter your message here...")
radio_button = Radio([("Single", "single"), ("Married", "married"), ("Divorced", "divorced")])
dataframe = Dataframe(columns=["Item", "Cost"], datatype=["str", "number"])
file_upload = File(types=["image"])
label = Label()
# Define the interface
interface = Interface(
fn=generate_image,
inputs=[textarea, radio_button, dataframe, file_upload],
outputs=label,
capture_session=True,
interpretation="default",
examples=[
["Hello, world!", "Single", [[("Suit", 5000), ("Laptop", 800), ("Car", 1800)]], None],
["I love you.", "Married", [[("Suit", 800), ("Watch", 1800), ("Car", 800)]], None],
],
title="Text-to-Image Generator",
description="Generate an image based on text input",
)
# Generate image function
def generate_image(textarea, radio_button, dataframe, file_upload):
# Convert text to image file
text_file = textarea.value
font_name = text_file.split(".")
if len(font_name) > 1:
font_name = font_name[1]
else:
font_name = "default"
font = ImageFont.truetype(TEXT_FONT, 20)
line_width = calculate_line_width(textarea.value, font)
line_height = font.getsize(textarea.value)[1] * 2
text_color = (0, 0, 0)
text_image = Image.new("RGB", (line_width, line_height), (255, 255, 255))
text_draw = ImageDraw.Draw(text_image)
text_draw.text((0, 0), textarea.value, font=font, fill=text_color)
text_image = text_image.convert("L")
text_image = text_image.point(lambda x: 255 - x)
# Merge text image with user image
try:
background_image = Image.open(file_upload.value)
except Exception:
background_image = None
if background_image is not None:
background_image = background_image.convert("L")
text_image = text_image.resize(background_image.size)
text_image = text_image.convert("RGB")
text_image.paste(background_image, box=(0, 0), mask=text_image)
# Add radio button selection to label
if radio_button.selected_value == "married":
label_text = "Your personalized wedding invitation is almost here!"
elif radio_button.selected_value == "single":
label_text = "This is the image of your special message"
else:
label_text = "You are getting divorced?"
# Add assets to label
label_text += " πŸ˜‚"
for item in dataframe.value:
cost = item[1]
label_text += f" {item[0]}-\${cost:,}"
# Display the generated image
generated_image.show(label_text, text_image)
# Define calculate_line_width function
def calculate_line_width(text, font):
max_width = 0
for line in text.split("\n"):
line_width = font.getsize(line)[0]
if line_width > max_width:
max_width = line_width
return max_width
# Run the interface
interface.launch()