bb / app.py
awais0300's picture
Update app.py
7dd215d verified
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")