Euphoria / app.py
gaur3009's picture
Update app.py
f9d6250 verified
import gradio as gr
from PIL import Image, ImageOps
import numpy as np
import cv2
# Global variables to maintain state
tshirt_img = None
design_img = None
vertices = []
polygon_drawn = False
design_pos = (250, 250)
def load_tshirt(image):
global tshirt_img
tshirt_img = image.resize((600, 600), Image.Resampling.LANCZOS)
return tshirt_img
def load_design(image):
global design_img, design_pos
design_img = image.resize((100, 100), Image.Resampling.LANCZOS)
design_pos = (250, 250)
return tshirt_img, design_img, design_pos
def add_polygon_vertex(x, y):
global vertices, polygon_drawn
if tshirt_img and not polygon_drawn:
vertices.append((x, y))
if len(vertices) > 2 and np.linalg.norm(np.array(vertices[-1]) - np.array(vertices[0])) < 10:
vertices[-1] = vertices[0] # Close the polygon
polygon_drawn = True
return tshirt_img, design_img, design_pos
def fit_design():
global design_img, tshirt_img, vertices, polygon_drawn
if design_img and tshirt_img and polygon_drawn:
src_pts = np.array([[0, 0], [design_img.width, 0], [design_img.width, design_img.height], [0, design_img.height]], dtype="float32")
dst_pts = np.array(vertices, dtype="float32")
M = cv2.getPerspectiveTransform(src_pts, dst_pts)
design_np = np.array(design_img)
transformed_design = cv2.warpPerspective(design_np, M, (tshirt_img.width, tshirt_img.height))
transformed_design_img = Image.fromarray(transformed_design)
design_img = transformed_design_img
return tshirt_img, design_img, design_pos
return tshirt_img, design_img, design_pos
def rotate_design(angle):
global design_img
if design_img:
angle = int(angle)
rotated_design = design_img.rotate(angle, expand=True)
design_img = rotated_design
return tshirt_img, design_img, design_pos
return tshirt_img, design_img, design_pos
def display_image(x=0, y=0, angle=0, image_type=None, image=None):
if image_type == "tshirt":
return load_tshirt(image)
elif image_type == "design":
return load_design(image)
elif image_type == "polygon":
return add_polygon_vertex(x, y)
elif image_type == "fit":
return fit_design()
elif image_type == "rotate":
return rotate_design(angle)
return tshirt_img, design_img, design_pos
with gr.Blocks() as demo:
tshirt_image = gr.Image(label="T-Shirt Image")
design_image = gr.Image(label="Design Image")
rotate_slider = gr.Slider(minimum=0, maximum=360, step=1, label="Rotate Design")
x_coord = gr.Number(label="X Coordinate")
y_coord = gr.Number(label="Y Coordinate")
tshirt_output = gr.Image(label="Output T-Shirt with Design")
design_output = gr.Image(label="Output Design on T-Shirt")
# Upload options for T-shirt and design images
tshirt_image.upload(lambda image: display_image(image_type="tshirt", image=image), inputs=tshirt_image, outputs=tshirt_output)
design_image.upload(lambda image: display_image(image_type="design", image=image), inputs=design_image, outputs=[tshirt_output, design_output])
# Controls for adding polygon vertices, fitting the design, and rotating
gr.Button("Add Polygon Vertex").click(lambda x, y: display_image(x=x, y=y, image_type="polygon"), inputs=[x_coord, y_coord], outputs=[tshirt_output, design_output])
gr.Button("Fit Design").click(lambda: display_image(image_type="fit"), None, [tshirt_output, design_output])
rotate_slider.change(lambda angle: display_image(angle=angle, image_type="rotate"), inputs=rotate_slider, outputs=[tshirt_output, design_output])
demo.launch(share=True)