|
|
import streamlit as st |
|
|
from PIL import Image, ImageEnhance, ImageFilter |
|
|
import io |
|
|
|
|
|
|
|
|
def show_image(img): |
|
|
st.image(img, caption="Edited Image", use_column_width=True) |
|
|
|
|
|
|
|
|
def reset_image(): |
|
|
st.session_state["image"] = st.session_state["original_image"] |
|
|
|
|
|
|
|
|
def undo_edit(): |
|
|
if len(st.session_state["history"]) > 1: |
|
|
st.session_state["history"].pop() |
|
|
st.session_state["image"] = st.session_state["history"][-1] |
|
|
else: |
|
|
st.sidebar.warning("No more edits to undo!") |
|
|
|
|
|
|
|
|
st.title("Advanced Image Editor") |
|
|
|
|
|
|
|
|
st.sidebar.header("Upload Image") |
|
|
uploaded_image = st.sidebar.file_uploader("Upload your image", type=["jpg", "jpeg", "png"]) |
|
|
|
|
|
|
|
|
if uploaded_image is not None: |
|
|
img = Image.open(uploaded_image) |
|
|
|
|
|
|
|
|
if "original_image" not in st.session_state: |
|
|
st.session_state["original_image"] = img.copy() |
|
|
|
|
|
|
|
|
if "history" not in st.session_state: |
|
|
st.session_state["history"] = [img.copy()] |
|
|
|
|
|
st.session_state["image"] = img.copy() |
|
|
|
|
|
|
|
|
show_image(st.session_state["image"]) |
|
|
|
|
|
|
|
|
if uploaded_image is not None: |
|
|
st.sidebar.header("Edit Image") |
|
|
|
|
|
|
|
|
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_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_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_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 |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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)) |
|
|
|
|
|
|
|
|
st.session_state["history"].append(st.session_state["image"].copy()) |
|
|
|
|
|
|
|
|
if st.sidebar.button("Reset to Original"): |
|
|
reset_image() |
|
|
st.sidebar.success("Image reset to original.") |
|
|
|
|
|
|
|
|
if st.sidebar.button("Undo Last Edit"): |
|
|
undo_edit() |
|
|
st.sidebar.success("Last edit undone.") |
|
|
|
|
|
|
|
|
show_image(st.session_state["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") |
|
|
|