Spaces:
Running
Running
# 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() |