import gradio as gr import numpy as np from PIL import Image from typing import Optional from models import remix_images def generate_blank_image(width: int = 512, height: int = 512) -> Image.Image: """Generates a blank black PIL Image.""" return Image.fromarray(np.zeros((height, width, 3), dtype=np.uint8)) with gr.Blocks(css="footer {visibility: hidden}") as demo: gr.HTML( """

Image Remixer

Drag and drop up to three images, provide a text prompt, and let AI remix them!

Built with anycoder

""" ) with gr.Row(): with gr.Column(): canny_input = gr.Image(label="Image for Canny Control (edges)", type="pil", height=256, value=generate_blank_image(), sources=["upload", "clipboard"], interactive=True) depth_input = gr.Image(label="Image for Depth Control (structure)", type="pil", height=256, value=generate_blank_image(), sources=["upload", "clipboard"], interactive=True) base_input = gr.Image(label="Base Image (optional, for img2img guidance and dimensions)", type="pil", height=256, value=generate_blank_image(), sources=["upload", "clipboard"], interactive=True) with gr.Column(): prompt_input = gr.Textbox(label="Text Prompt", placeholder="A fantastical landscape, highly detailed, oil painting", lines=3, interactive=True) guidance_scale = gr.Slider(minimum=1.0, maximum=20.0, value=7.5, step=0.1, label="Guidance Scale", interactive=True) num_inference_steps = gr.Slider(minimum=10, maximum=100, value=30, step=1, label="Inference Steps", interactive=True) with gr.Row(): generate_btn = gr.Button("Remix Images", variant="primary") clear_btn = gr.ClearButton([canny_input, depth_input, base_input, prompt_input, output_image]) with gr.Row(): output_image = gr.Image(label="Remixed Output", interactive=False, height=512) generate_btn.click( fn=remix_images, inputs=[ prompt_input, canny_input, depth_input, base_input, guidance_scale, num_inference_steps, ], outputs=output_image, show_progress="minimal", api_name="remix_images" ) demo.launch(enable_monitoring=True, queue=True)