mport gradio as gr import numpy as np import random import spaces import torch from diffusers import DiffusionPipeline from PIL import Image import io from PIL import ImageEnhance def get_edge_color(image): """ Get a random color from the edge of the image """ # Convert to numpy array img_array = np.array(image) # Get pixels from all edges top_edge = img_array[0, :, :] bottom_edge = img_array[-1, :, :] left_edge = img_array[:, 0, :] right_edge = img_array[:, -1, :] # Combine all edge pixels edge_pixels = np.concatenate([top_edge, bottom_edge, left_edge, right_edge]) # Pick a random edge pixel random_edge_color = tuple(edge_pixels[random.randint(0, len(edge_pixels)-1)]) return random_edge_color def color_match_tshirt(tshirt_image, target_color, threshold=30): """ Change white/near-white areas of the t-shirt to the target color """ # Convert to numpy array img_array = np.array(tshirt_image) # Create a mask for near-white pixels white_mask = np.all(np.abs(img_array - [255, 255, 255]) < threshold, axis=2) # Apply the new color to masked areas img_array[white_mask] = target_color return Image.fromarray(img_array) def add_logo_watermark(image, logo_path='logo.png', size_percentage=0.2): """ Add a logo watermark to the bottom right corner """ # Open and resize logo logo = Image.open(logo_path) # Calculate new logo size (20% of main image width) new_width = int(image.size[0] * size_percentage) new_height = int(new_width * logo.size[1] / logo.size[0]) logo = logo.resize((new_width, new_height), Image.Resampling.LANCZOS) # If logo has transparency, use it as mask if logo.mode == 'RGBA': mask = logo.split()[3] else: mask = None # Calculate position (bottom right corner with padding) position = (image.size[0] - logo.size[0] - 10, image.size[1] - logo.size[1] - 10) # Create a copy of the image result = image.copy() result.paste(logo, position, mask) return result def create_tshirt_preview(design_image, tshirt_color="white"): """ Overlay the design onto the t-shirt template with color matching """ # Load the template t-shirt image tshirt = Image.open('image.jpeg') tshirt_width, tshirt_height = tshirt.size # Get a random edge color from the design edge_color = get_edge_color(design_image) # Color match the t-shirt tshirt = color_match_tshirt(tshirt, edge_color) # Resize design (35% of shirt width) design_width = int(tshirt_width * 0.35) design_height = int(design_width * design_image.size[1] / design_image.size[0]) design_image = design_image.resize((design_width, design_height), Image.Resampling.LANCZOS) # Calculate position to center design x = (tshirt_width - design_width) // 2 y = int(tshirt_height * 0.2) # Create mask if design has transparency if design_image.mode == 'RGBA': mask = design_image.split()[3] else: mask = None # Paste design onto shirt tshirt.paste(design_image, (x, y), mask) # Add logo watermark tshirt = add_logo_watermark(tshirt) return tshirt @spaces.GPU() def infer(prompt, style=None, tshirt_color="white", seed=42, randomize_seed=False, width=1024, height=1024, num_inference_steps=4, progress=gr.Progress(track_tqdm=True)): if randomize_seed: seed = random.randint(0, MAX_SEED) enhanced_prompt = enhance_prompt_for_tshirt(prompt, style) generator = torch.Generator().manual_seed(seed) # Generate the design design_image = pipe( prompt=enhanced_prompt, width=width, height=height, num_inference_steps=num_inference_steps, generator=generator, guidance_scale=0.0 ).images[0] # Add logo to design design_image = add_logo_watermark(design_image) # Create t-shirt preview tshirt_preview = create_tshirt_preview(design_image, tshirt_color) return design_image, tshirt_preview, seed # Available t-shirt colors TSHIRT_COLORS = { "White": "#FFFFFF", "Black": "#000000", "Navy": "#000080", "Gray": "#808080" } examples = [ ["Cool geometric mountain landscape", "minimal", "White"], ["Vintage motorcycle with flames", "vintage", "Black"], ["flamingo in scenic forset", "realistic", "White"], ["Adventure Starts typography", "typography", "White"] ] styles = [ "minimal", "vintage", "artistic", "geometric", "typography", "realistic" ] css = """ #col-container { margin: 0 auto; max-width: 1200px !important; padding: 20px; } .main-title { text-align: center; color: #2d3748; margin-bottom: 1rem; font-family: 'Poppins', sans-serif; } .subtitle { text-align: center; color: #4a5568; margin-bottom: 2rem; font-family: 'Inter', sans-serif; font-size: 0.95rem; line-height: 1.5; } .design-input { border: 2px solid #e2e8f0; border-radius: 10px; padding: 12px !important; margin-bottom: 1rem !important; font-size: 1rem; transition: all 0.3s ease; } .results-row { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px; } """ with gr.Blocks(css=css, theme=gr.themes.Soft()) as demo: with gr.Column(elem_id="col-container"): gr.Markdown( """ # 👕Deradh's T-Shirt Design Generator """, elem_classes=["main-title"] ) gr.Markdown( """ Create unique t-shirt designs using Deradh's AI. Describe your design idea and select a style to generate professional-quality artwork perfect for custom t-shirts. """, elem_classes=["subtitle"] ) with gr.Row(): with gr.Column(scale=2): prompt = gr.Text( label="Design Description", show_label=False, max_lines=1, placeholder="Describe your t-shirt design idea", container=False, elem_classes=["design-input"] ) with gr.Column(scale=1): style = gr.Dropdown( choices=[""] + styles, value="", label="Style", container=False ) with gr.Column(scale=1): tshirt_color = gr.Dropdown( choices=list(TSHIRT_COLORS.keys()), value="White", label="T-Shirt Color", container=False ) run_button = gr.Button( "✨ Generate", scale=0, elem_classes=["generate-button"] ) with gr.Row(elem_classes=["results-row"]): result = gr.Image( label="Generated Design", show_label=True, elem_classes=["result-image"] ) preview = gr.Image( label="T-Shirt Preview", show_label=True, elem_classes=["preview-image"] ) with gr.Accordion("🔧 Advanced Settings", open=False): with gr.Group(): seed = gr.Slider( label="Design Seed", minimum=0, maximum=MAX_SEED, step=1, value=0, ) randomize_seed = gr.Checkbox( label="Randomize Design", value=True ) with gr.Row(): width = gr.Slider( label="Width", minimum=256, maximum=MAX_IMAGE_SIZE, step=32, value=1024, ) height = gr.Slider( label="Height", minimum=256, maximum=MAX_IMAGE_SIZE, step=32, value=1024, ) num_inference_steps = gr.Slider( label="Generation Quality (Steps)", minimum=1, maximum=50, step=1, value=4, ) gr.Examples( examples=examples, fn=infer, inputs=[prompt, style, tshirt_color], outputs=[result, preview, seed], cache_examples=True ) gr.on( triggers=[run_button.click, prompt.submit], fn=infer, inputs=[prompt, style, tshirt_color, seed, randomize_seed, width, height, num_inference_steps], outputs=[result, preview, seed] ) demo.launch()