import gradio as gr from PIL import Image, ImageOps, ImageDraw, ImageFont import numpy as np def apply_color(image, color): color = Image.new('RGB', image.size, color) colored_image = Image.blend(image.convert('RGB'), color, alpha=0.5) return colored_image def add_design(image, design, position): if design: image.paste(design, position, design) return image def resize_image(image, size): if size: return image.resize(size) return image def rotate_image(image, angle): if angle: return image.rotate(angle, expand=True) return image def crop_image(image, crop_coords): if crop_coords: return image.crop(crop_coords) return image def add_text(image, text, position, font_size, font_color): if text: draw = ImageDraw.Draw(image) font = ImageFont.load_default() draw.text(position, text, fill=font_color, font=font) return image def process_image(image, color, design, design_position, text, text_position, font_size, font_color, resize, rotate, crop_coords): if color: image = apply_color(image, color) if design: image = add_design(image, design, design_position) if text: image = add_text(image, text, text_position, font_size, font_color) if resize: image = resize_image(image, resize) if rotate: image = rotate_image(image, rotate) if crop_coords: image = crop_image(image, crop_coords) return image def get_crop_coords(crop_points): if crop_points: x_coords = [point[0] for point in crop_points] y_coords = [point[1] for point in crop_points] return (min(x_coords), min(y_coords), max(x_coords), max(y_coords)) return None design_position = (100, 100) # Default position for design text_position = (50, 50) # Default position for text interface = gr.Interface( fn=lambda image, color, design, design_position, text, text_position, font_size, font_color, resize, rotate, crop_points: process_image( image, color, design, design_position, text, text_position, font_size, font_color, resize, rotate, get_crop_coords(crop_points) ), inputs=[ gr.Image(type="pil"), gr.ColorPicker(label="Color"), gr.Image(type="pil", optional=True, label="Design"), gr.Point(label="Design Position"), gr.Textbox(label="Text"), gr.Point(label="Text Position"), gr.Slider(10, 100, step=1, default=20, label="Font Size"), gr.ColorPicker(label="Font Color"), gr.Points(label="Resize", optional=True), gr.Slider(0, 360, step=1, default=None, label="Rotate"), gr.Points(label="Crop Area") ], outputs=gr.Image(type="pil"), live=True ) interface.launch()