gaur3009 commited on
Commit
4afa880
·
verified ·
1 Parent(s): c5e2616

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +90 -0
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()