Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from PIL import Image, ImageOps
|
3 |
+
import numpy as np
|
4 |
+
import cv2
|
5 |
+
|
6 |
+
# Global variables to maintain state
|
7 |
+
tshirt_img = None
|
8 |
+
design_img = None
|
9 |
+
vertices = []
|
10 |
+
polygon_drawn = False
|
11 |
+
design_pos = (250, 250)
|
12 |
+
|
13 |
+
def load_tshirt(image):
|
14 |
+
global tshirt_img
|
15 |
+
tshirt_img = image.resize((600, 600))
|
16 |
+
return tshirt_img
|
17 |
+
|
18 |
+
def load_design(image):
|
19 |
+
global design_img, design_pos
|
20 |
+
design_img = image.resize((100, 100), Image.ANTIALIAS)
|
21 |
+
design_pos = (250, 250)
|
22 |
+
return tshirt_img, design_img, design_pos
|
23 |
+
|
24 |
+
def add_polygon_vertex(x, y):
|
25 |
+
global vertices, polygon_drawn
|
26 |
+
if tshirt_img and not polygon_drawn:
|
27 |
+
vertices.append((x, y))
|
28 |
+
if len(vertices) > 2 and np.linalg.norm(np.array(vertices[-1]) - np.array(vertices[0])) < 10:
|
29 |
+
vertices[-1] = vertices[0] # Close the polygon
|
30 |
+
polygon_drawn = True
|
31 |
+
return vertices
|
32 |
+
|
33 |
+
def fit_design():
|
34 |
+
global design_img, tshirt_img, vertices, polygon_drawn
|
35 |
+
if design_img and tshirt_img and polygon_drawn:
|
36 |
+
src_pts = np.array([[0, 0], [design_img.width, 0], [design_img.width, design_img.height], [0, design_img.height]], dtype="float32")
|
37 |
+
dst_pts = np.array(vertices, dtype="float32")
|
38 |
+
|
39 |
+
M = cv2.getPerspectiveTransform(src_pts, dst_pts)
|
40 |
+
design_np = np.array(design_img)
|
41 |
+
transformed_design = cv2.warpPerspective(design_np, M, (tshirt_img.width, tshirt_img.height))
|
42 |
+
transformed_design_img = Image.fromarray(transformed_design)
|
43 |
+
|
44 |
+
design_img = transformed_design_img
|
45 |
+
return tshirt_img, design_img, design_pos
|
46 |
+
return tshirt_img, design_img, design_pos
|
47 |
+
|
48 |
+
def rotate_design(angle):
|
49 |
+
global design_img
|
50 |
+
if design_img:
|
51 |
+
angle = int(angle)
|
52 |
+
rotated_design = design_img.rotate(angle, expand=True)
|
53 |
+
design_img = rotated_design
|
54 |
+
return tshirt_img, design_img, design_pos
|
55 |
+
return tshirt_img, design_img, design_pos
|
56 |
+
|
57 |
+
def display_image(x=0, y=0, angle=0, image_type=None, image=None):
|
58 |
+
global vertices, design_pos
|
59 |
+
if image_type == "tshirt":
|
60 |
+
return load_tshirt(image)
|
61 |
+
elif image_type == "design":
|
62 |
+
return load_design(image)
|
63 |
+
elif image_type == "polygon":
|
64 |
+
add_polygon_vertex(x, y)
|
65 |
+
elif image_type == "fit":
|
66 |
+
return fit_design()
|
67 |
+
elif image_type == "rotate":
|
68 |
+
return rotate_design(angle)
|
69 |
+
return tshirt_img, design_img, design_pos
|
70 |
+
|
71 |
+
with gr.Blocks() as demo:
|
72 |
+
tshirt_image = gr.Image(label="T-Shirt Image")
|
73 |
+
design_image = gr.Image(label="Design Image")
|
74 |
+
rotate_slider = gr.Slider(minimum=0, maximum=360, step=1, label="Rotate Design")
|
75 |
+
x_coord = gr.Number(label="X Coordinate")
|
76 |
+
y_coord = gr.Number(label="Y Coordinate")
|
77 |
+
|
78 |
+
tshirt_output = gr.Image(label="Output T-Shirt with Design")
|
79 |
+
design_output = gr.Image(label="Output Design on T-Shirt")
|
80 |
+
|
81 |
+
# Upload options for T-shirt and design images
|
82 |
+
tshirt_image.upload(display_image, [x_coord, y_coord, rotate_slider, gr.State(value="tshirt"), tshirt_image], tshirt_output)
|
83 |
+
design_image.upload(display_image, [x_coord, y_coord, rotate_slider, gr.State(value="design"), design_image], [tshirt_output, design_output])
|
84 |
+
|
85 |
+
# Controls for adding polygon vertices, fitting the design, and rotating
|
86 |
+
gr.Button("Add Polygon Vertex").click(display_image, [x_coord, y_coord, rotate_slider, gr.State(value="polygon")], [tshirt_output, design_output])
|
87 |
+
gr.Button("Fit Design").click(display_image, [x_coord, y_coord, rotate_slider, gr.State(value="fit")], [tshirt_output, design_output])
|
88 |
+
rotate_slider.change(display_image, [x_coord, y_coord, rotate_slider, gr.State(value="rotate")], [tshirt_output, design_output])
|
89 |
+
|
90 |
+
demo.launch()
|