ImageEnhancer / app.py
KamalShahid's picture
Create app.py
30e7ddb verified
raw
history blame
3.16 kB
import streamlit as st
from PIL import Image, ImageEnhance, ImageOps, ImageFilter
import numpy as np
import cv2
from skimage import filters, transform
# App title
st.title("Image Editor App")
# Sidebar
st.sidebar.title("Features")
uploaded_file = st.sidebar.file_uploader("Upload an Image", type=["png", "jpg", "jpeg"])
if uploaded_file:
img = Image.open(uploaded_file)
img_array = np.array(img)
# Basic Editing
st.sidebar.subheader("Basic Editing")
brightness = st.sidebar.slider("Brightness", 0.5, 3.0, 1.0)
contrast = st.sidebar.slider("Contrast", 0.5, 3.0, 1.0)
saturation = st.sidebar.slider("Saturation", 0.5, 3.0, 1.0)
rotation_angle = st.sidebar.slider("Rotate", 0, 360, 0)
flip_option = st.sidebar.radio("Flip", ["None", "Horizontal", "Vertical"])
# Advanced Editing
st.sidebar.subheader("Advanced Editing")
blur = st.sidebar.slider("Blur", 0, 10, 0)
edge_detection = st.sidebar.checkbox("Edge Detection")
crop_left = st.sidebar.slider("Crop Left (%)", 0, 50, 0)
crop_right = st.sidebar.slider("Crop Right (%)", 0, 50, 0)
crop_top = st.sidebar.slider("Crop Top (%)", 0, 50, 0)
crop_bottom = st.sidebar.slider("Crop Bottom (%)", 0, 50, 0)
# Creative Features
st.sidebar.subheader("Creative Features")
text_overlay = st.sidebar.text_input("Text Overlay", "Enter text")
text_position_x = st.sidebar.slider("Text X Position", 0, img.width, 50)
text_position_y = st.sidebar.slider("Text Y Position", 0, img.height, 50)
# Apply transformations
enhancer = ImageEnhance.Brightness(img)
img = enhancer.enhance(brightness)
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(contrast)
enhancer = ImageEnhance.Color(img)
img = enhancer.enhance(saturation)
if rotation_angle:
img = img.rotate(rotation_angle)
if flip_option == "Horizontal":
img = ImageOps.mirror(img)
elif flip_option == "Vertical":
img = ImageOps.flip(img)
if blur > 0:
img = img.filter(ImageFilter.GaussianBlur(blur))
if edge_detection:
edges = cv2.Canny(np.array(img), 100, 200)
img = Image.fromarray(edges)
if any([crop_left, crop_right, crop_top, crop_bottom]):
width, height = img.size
img = img.crop((
width * crop_left // 100,
height * crop_top // 100,
width * (100 - crop_right) // 100,
height * (100 - crop_bottom) // 100
))
# Text Overlay
if text_overlay:
img = np.array(img)
cv2.putText(img, text_overlay, (text_position_x, text_position_y),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
img = Image.fromarray(img)
# Display original and edited images
st.image(img_array, caption="Original Image", use_column_width=True)
st.image(img, caption="Edited Image", use_column_width=True)
# Download option
st.sidebar.download_button(
label="Download Edited Image",
data=img.tobytes(),
file_name="edited_image.png",
mime="image/png"
)
else:
st.info("Please upload an image to begin.")