import gradio as gr from PIL import Image, ImageOps, ImageFilter, ImageEnhance import io def apply_operation(img, operation, factor=1.0): if img is None: return None pil_img = Image.fromarray(img) if operation == "rotate_left": pil_img = pil_img.rotate(90, expand=True) elif operation == "rotate_right": pil_img = pil_img.rotate(-90, expand=True) elif operation == "flip_horizontal": pil_img = ImageOps.mirror(pil_img) elif operation == "flip_vertical": pil_img = ImageOps.flip(pil_img) elif operation == "grayscale": pil_img = ImageOps.grayscale(pil_img) elif operation == "blur": pil_img = pil_img.filter(ImageFilter.GaussianBlur(radius=factor)) elif operation == "brightness": enhancer = ImageEnhance.Brightness(pil_img) pil_img = enhancer.enhance(factor) elif operation == "sharpen": enhancer = ImageEnhance.Sharpness(pil_img) pil_img = enhancer.enhance(factor) elif operation == "invert": pil_img = ImageOps.invert(pil_img.convert("RGB")) return pil_img with gr.Blocks() as demo: gr.Markdown("# Simple Image Editor") image_input = gr.Image(label="Upload Image", type="numpy") output_img = gr.Image(label="Edited Image") with gr.Row(): btn_rotate_left = gr.Button("Rotate Left ⟲") btn_rotate_right = gr.Button("Rotate Right ⟳") btn_flip_h = gr.Button("Flip Horizontal ↔") btn_flip_v = gr.Button("Flip Vertical ↕") btn_grayscale = gr.Button("Grayscale") btn_invert = gr.Button("Invert Colors") with gr.Row(): btn_blur = gr.Button("Blur") blur_slider = gr.Slider(0, 10, value=2, label="Blur Radius") btn_brightness = gr.Button("Brightness") brightness_slider = gr.Slider(0.1, 3.0, value=1.0, step=0.1, label="Brightness Factor") btn_sharpen = gr.Button("Sharpen") sharpen_slider = gr.Slider(0, 5, value=1, step=0.1, label="Sharpen Factor") def update_image(img, operation, factor=1.0): return apply_operation(img, operation, factor) btn_rotate_left.click(update_image, inputs=[image_input, gr.State("rotate_left")], outputs=output_img) btn_rotate_right.click(update_image, inputs=[image_input, gr.State("rotate_right")], outputs=output_img) btn_flip_h.click(update_image, inputs=[image_input, gr.State("flip_horizontal")], outputs=output_img) btn_flip_v.click(update_image, inputs=[image_input, gr.State("flip_vertical")], outputs=output_img) btn_grayscale.click(update_image, inputs=[image_input, gr.State("grayscale")], outputs=output_img) btn_invert.click(update_image, inputs=[image_input, gr.State("invert")], outputs=output_img) btn_blur.click(update_image, inputs=[image_input, gr.State("blur"), blur_slider], outputs=output_img) btn_brightness.click(update_image, inputs=[image_input, gr.State("brightness"), brightness_slider], outputs=output_img) btn_sharpen.click(update_image, inputs=[image_input, gr.State("sharpen"), sharpen_slider], outputs=output_img) demo.launch()