File size: 3,715 Bytes
4afa880
 
 
 
 
 
 
 
 
 
 
 
 
 
4318019
4afa880
 
 
 
4318019
4afa880
 
 
 
 
 
 
 
 
 
f418307
4afa880
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f418307
4afa880
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f9d6250
 
4afa880
 
f9d6250
f418307
f9d6250
4afa880
4318019
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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)