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)