import streamlit as st from PIL import Image, ImageEnhance, ImageFilter import io # Function to display image def show_image(img): st.image(img, caption="Edited Image", use_column_width=True) # Function to reset the image to the original state def reset_image(): st.session_state["image"] = st.session_state["original_image"] # Function to undo the last edit def undo_edit(): if len(st.session_state["history"]) > 1: st.session_state["history"].pop() # Remove last edit st.session_state["image"] = st.session_state["history"][-1] else: st.sidebar.warning("No more edits to undo!") # Title of the app st.title("Advanced Image Editor") # Sidebar for uploading the original image st.sidebar.header("Upload Image") uploaded_image = st.sidebar.file_uploader("Upload your image", type=["jpg", "jpeg", "png"]) # Save the original image in session state if uploaded_image is not None: img = Image.open(uploaded_image) # Store the original image in session state if "original_image" not in st.session_state: st.session_state["original_image"] = img.copy() # Store the current image and edit history if "history" not in st.session_state: st.session_state["history"] = [img.copy()] st.session_state["image"] = img.copy() # Display the image show_image(st.session_state["image"]) # Options to edit the image if uploaded_image is not None: st.sidebar.header("Edit Image") # Rotation rotate_angle = st.sidebar.slider("Rotate image", 0, 360, 0) if rotate_angle != 0: edited_img = st.session_state["image"].rotate(rotate_angle) st.session_state["image"] = edited_img # Brightness Adjustment brightness_factor = st.sidebar.slider("Brightness", 0.0, 2.0, 1.0) enhancer = ImageEnhance.Brightness(st.session_state["image"]) edited_img = enhancer.enhance(brightness_factor) st.session_state["image"] = edited_img # Contrast Adjustment contrast_factor = st.sidebar.slider("Contrast", 0.0, 2.0, 1.0) enhancer = ImageEnhance.Contrast(st.session_state["image"]) edited_img = enhancer.enhance(contrast_factor) st.session_state["image"] = edited_img # Sharpness Adjustment sharpness_factor = st.sidebar.slider("Sharpness", 0.0, 2.0, 1.0) enhancer = ImageEnhance.Sharpness(st.session_state["image"]) edited_img = enhancer.enhance(sharpness_factor) st.session_state["image"] = edited_img # Apply Filters filter_option = st.sidebar.selectbox("Apply Filter", ["None", "Blur", "Edge Enhance", "Detail"]) if filter_option == "Blur": st.session_state["image"] = st.session_state["image"].filter(ImageFilter.GaussianBlur(radius=2)) elif filter_option == "Edge Enhance": st.session_state["image"] = st.session_state["image"].filter(ImageFilter.EDGE_ENHANCE) elif filter_option == "Detail": st.session_state["image"] = st.session_state["image"].filter(ImageFilter.DETAIL) # Crop Image (User specifies the cropping box) st.sidebar.subheader("Crop Image") crop_x1 = st.sidebar.slider("Crop X1", 0, st.session_state["image"].width, 0) crop_y1 = st.sidebar.slider("Crop Y1", 0, st.session_state["image"].height, 0) crop_x2 = st.sidebar.slider("Crop X2", 0, st.session_state["image"].width, st.session_state["image"].width) crop_y2 = st.sidebar.slider("Crop Y2", 0, st.session_state["image"].height, st.session_state["image"].height) if crop_x1 < crop_x2 and crop_y1 < crop_y2: st.session_state["image"] = st.session_state["image"].crop((crop_x1, crop_y1, crop_x2, crop_y2)) # Save the image in the edit history st.session_state["history"].append(st.session_state["image"].copy()) # Reset Image if st.sidebar.button("Reset to Original"): reset_image() st.sidebar.success("Image reset to original.") # Undo Last Edit if st.sidebar.button("Undo Last Edit"): undo_edit() st.sidebar.success("Last edit undone.") # Display the edited image show_image(st.session_state["image"]) # Allow the user to download the edited image buffer = io.BytesIO() st.session_state["image"].save(buffer, format="PNG") buffer.seek(0) st.sidebar.download_button("Download Edited Image", buffer, "edited_image.png", "image/png")