Spaces:
Runtime error
Runtime error
import gradio as gr | |
import random | |
import matplotlib.pyplot as plt | |
import colorsys | |
# Generate a random hex color | |
def random_hex(): | |
return "#" + "".join(f"{random.randint(0, 255):02x}" for _ in range(3)) | |
# Convert hex to HSL | |
def hex_to_hsl(hex_color): | |
r, g, b = int(hex_color[1:3], 16) / 255.0, int(hex_color[3:5], 16) / 255.0, int(hex_color[5:7], 16) / 255.0 | |
return colorsys.rgb_to_hls(r, g, b) | |
# Convert HSL to hex | |
def hsl_to_hex(h, l, s): | |
r, g, b = colorsys.hls_to_rgb(h, l, s) | |
return "#" + "".join(f"{int(c * 255):02x}" for c in (r, g, b)) | |
# Generate a harmonious palette | |
def generate_palette(locked_colors): | |
locked_hsl = [hex_to_hsl(color) if color else None for color in locked_colors] | |
base_hue = next((h for h, _, _ in locked_hsl if h is not None), random.random()) | |
base_lum = next((l for _, l, _ in locked_hsl if l is not None), 0.5) | |
base_sat = next((s for _, _, s in locked_hsl if s is not None), 0.7) | |
new_palette = [] | |
for i in range(5): | |
if locked_colors[i]: | |
new_palette.append(locked_colors[i]) | |
else: | |
new_hue = (base_hue + random.uniform(-0.1, 0.1)) % 1.0 | |
new_lum = min(max(base_lum + random.uniform(-0.1, 0.1), 0.2), 0.8) | |
new_sat = min(max(base_sat + random.uniform(-0.1, 0.1), 0.4), 1.0) | |
new_palette.append(hsl_to_hex(new_hue, new_lum, new_sat)) | |
return new_palette | |
# Create color swatches | |
def display_palette(colors): | |
fig, ax = plt.subplots(figsize=(8, 2)) | |
rgb_colors = [[int(h[i:i+2], 16) for i in (1, 3, 5)] for h in colors] | |
ax.imshow([rgb_colors], aspect="auto") | |
ax.set_xticks([]) | |
ax.set_yticks([]) | |
return fig, colors | |
# Initialize locked colors | |
initial_palette = generate_palette([None] * 5) | |
# Gradio UI | |
def update_palette(*locks): | |
locks = [color if color and color.startswith("#") else None for color in locks] | |
new_palette = generate_palette(locks) | |
return display_palette(new_palette) + tuple(new_palette) | |
with gr.Blocks(theme=gr.themes.Soft()) as iface: | |
gr.Markdown("# π¨ AI-Powered Color Palette Generator") | |
gr.Markdown("Click on a color to lock it. Generate fresh palettes for unlocked colors!") | |
with gr.Row(): | |
lock_inputs = [gr.ColorPicker(label=f"Color {i+1}", value=initial_palette[i]) for i in range(5)] | |
palette_output = gr.Plot(label="Generated Palette") | |
generate_button = gr.Button("Regenerate Palette π¨") | |
generate_button.click(update_palette, inputs=lock_inputs, outputs=[palette_output] + lock_inputs) | |
initial_fig, _ = display_palette(initial_palette) | |
palette_output.value = initial_fig | |
# Launch the app | |
if __name__ == "__main__": | |
iface.launch() |