File size: 4,351 Bytes
af42e95
7dd215d
bc904d8
 
7dd215d
bc904d8
 
 
 
 
 
af42e95
7dd215d
 
 
 
 
 
 
 
af42e95
7dd215d
bc904d8
 
 
 
 
 
 
 
 
 
 
 
 
7dd215d
 
 
 
bc904d8
 
7dd215d
bc904d8
 
 
 
 
 
 
 
 
7dd215d
 
bc904d8
 
 
 
7dd215d
 
 
 
 
 
 
 
bc904d8
7dd215d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc904d8
 
 
 
 
 
 
 
7dd215d
 
 
 
bc904d8
 
 
 
 
7dd215d
 
 
 
 
bc904d8
 
7dd215d
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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")