import gradio as gr with gr.Blocks() as demo: with gr.Tab("Default ImageEditor"): im = gr.ImageEditor(value="./cheetah.jpg", interactive=True, fixed_canvas=True) with gr.Tab("Brush Options"): with gr.Row(): with gr.Column(): image_editor = gr.ImageEditor( value="./cheetah.jpg", interactive=True, fixed_canvas=True, brush=gr.Brush( default_size=10, default_color="#000000", colors=[ "#FFA50050", "#FF0000", ("#00FF00", 0.5), ("rgba(255, 255, 0, 0.5)", 0.5), "rgba(255, 0, 0, 0.5)", "pink", "hsla(300, 100%, 50%, 0.5)", ("hsl(300, 100%, 50%)", 0.8), ("crimson", 0.5), ("#000080", 1), ], ), eraser=gr.Eraser(default_size=10), ) image_editor.apply(fn=lambda x: print(x), inputs=[image_editor]) with gr.Column(): with gr.Group(): brush_size = gr.Slider( minimum=1, maximum=100, value=10, label="Brush Size", ) brush_opacity = gr.Slider( minimum=0, maximum=100, value=50, label="Brush Opacity", ) brush_color = gr.ColorPicker(value="#000000", label="Brush Color") with gr.Group(): eraser_size = gr.Slider( minimum=1, maximum=100, value=10, label="Eraser Size", ) update_btn = gr.Button("Apply Settings") status_msg = gr.Markdown( value="**Adjust settings and click Apply.**", ) def update_editor_settings(size, opacity, color, e_size): return ( gr.ImageEditor( brush=gr.Brush( default_size=size, default_color=(color, opacity / 100), colors=[ "#FFA50050", "#FF0000", ("#00FF00", 0.5), ("rgba(255, 255, 0, 0.5)", 0.5), "rgba(255, 0, 0, 0.5)", "pink", "hsla(300, 100%, 50%, 0.5)", ("hsl(300, 100%, 50%)", 0.8), ("crimson", 0.5), ("#000080", 1), ], ), eraser=gr.Eraser(default_size=e_size), ), f'### Settings applied:\n\n- `Brush.default_size={size}`\n- `Brush.default_color=("{color}", {opacity / 100})`\n- `Eraser.default_size={e_size}`', ) update_btn.click( update_editor_settings, inputs=[brush_size, brush_opacity, brush_color, eraser_size], outputs=[image_editor, status_msg], ) def update_status(size=None, opacity=None, color=None, e_size=None): changes = [] if size is not None: changes.append(f"`Brush.default_size={size}`") if opacity is not None: changes.append(f"`Brush.default_color=('{color}', {opacity / 100})`") if color is not None: if opacity is not None: changes.append(f"`Brush.default_color=('{color}', {opacity / 100})`") else: changes.append(f"`Brush.default_color='{color}'`") if e_size is not None: changes.append(f"`Eraser.default_size={e_size}`") if changes: return ( "Settings changed:\n\n" + "- " + "\n- ".join(changes) + "\n\n**Click Apply to update.**" ) return "" brush_size.change( fn=update_status, inputs=[brush_size, brush_opacity, brush_color, eraser_size], outputs=status_msg, ) brush_opacity.change( fn=update_status, inputs=[brush_size, brush_opacity, brush_color, eraser_size], outputs=status_msg, ) brush_color.change( fn=update_status, inputs=[brush_size, brush_opacity, brush_color, eraser_size], outputs=status_msg, ) eraser_size.change( fn=update_status, inputs=[brush_size, brush_opacity, brush_color, eraser_size], outputs=status_msg, ) with gr.Tab("Layer Options"): with gr.Row(): with gr.Column(): im = gr.ImageEditor( value="./cheetah.jpg", interactive=True, layers=gr.LayerOptions( allow_additional_layers=False, layers=["Mask"] ), ) with gr.Column(): disable_layers = gr.Checkbox(value=False, label="Disable Layers") allow_additional_layers = gr.Checkbox( value=True, label="Allow Additional Layers" ) layer = gr.Dropdown( choices=["Mask", "Mask 2"], value="Mask", label="Layer", multiselect=True, interactive=True, allow_custom_value=True, ) gr.Checkbox(value=True, label="Allow Additional Layers") update_layer_btn = gr.Button("Update Layer Options") status_msg = gr.Markdown(value="**Adjust settings and click Apply.**") def update_layer_options( disable_layers, allow_additional_layers, layer ): print( "update_layer_options", disable_layers, allow_additional_layers, layer, ) return ( gr.ImageEditor( value="./cheetah.jpg", interactive=True, layers=( False if disable_layers else gr.LayerOptions( allow_additional_layers=allow_additional_layers, layers=layer, ) ), ), f"### Settings applied:\n\n- `LayerOptions=False`\n- `LayerOptions.allow_additional_layers={allow_additional_layers}`\n- `LayerOptions.layers={layer}`", ) update_layer_btn.click( update_layer_options, inputs=[disable_layers, allow_additional_layers, layer], outputs=[im, status_msg], ) with gr.Tab("ImageEditor Templates"): gr.ImageMask(value="./cheetah.jpg", interactive=True) gr.Paint(interactive=True) gr.Sketchpad(interactive=True) if __name__ == "__main__": demo.launch()