Image_Resizer / app.py
engrharis's picture
Upload app.py with huggingface_hub
e5a870d verified
import streamlit as st
from PIL import Image
import io
def resize_image(image, target_size_kb=None, quality=None):
"""Resizes and compresses an image based on either target size or quality."""
try:
img = Image.open(image)
except Exception as e:
st.error(f"Error opening image: {e}")
return None
img_byte_arr = io.BytesIO()
original_size_kb = len(image.getvalue()) / 1024 # Calculate the original size in KB
if target_size_kb and target_size_kb > original_size_kb:
st.error("Target size must be less than or equal to the original image size.")
return None
if target_size_kb is not None:
# Resize based on target size
current_quality = 95 # Start with a high quality
while True:
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format='JPEG', quality=current_quality)
current_size_kb = len(img_byte_arr.getvalue()) / 1024
if current_size_kb <= target_size_kb or current_quality <= 10:
break
current_quality -= 5 # Adjust quality in smaller steps
if current_quality <= 10 and current_size_kb > target_size_kb:
st.warning("Could not achieve the exact target size. Returning best possible result.")
elif quality is not None:
# Resize based on quality percentage
img.save(img_byte_arr, format='JPEG', quality=quality)
else:
st.warning("No resize option selected. Displaying original image.")
img.save(img_byte_arr, format='JPEG') # Save the original image in byte array
resized_img = Image.open(img_byte_arr) # Reopen the image from the byte array
return resized_img
st.title("Image Resizer")
st.write("Resize and compress your images with ease!")
uploaded_file = st.file_uploader("Choose an Image:", type=["jpg", "jpeg", "png"])
if uploaded_file is not None:
original_size_kb = len(uploaded_file.getvalue()) / 1024 # Get original size in KB
st.info(f"Original Image Size: {original_size_kb:.2f} KB")
resize_option = st.selectbox("Resize Option:", ("Select an option", "Percentage Quality", "Desired Output Size"))
resized_image = None # Initialize resized_image as None
if resize_option == "Percentage Quality":
quality = st.slider("Quality (%)", min_value=1, max_value=100, value=85)
resized_image = resize_image(uploaded_file, quality=quality)
elif resize_option == "Desired Output Size":
size_unit = st.selectbox("Size Unit", ("KB", "MB"))
target_size = st.number_input("Target Size", min_value=1, value=int(original_size_kb))
if size_unit == "MB":
target_size_kb = target_size * 1024
else:
target_size_kb = target_size
if target_size_kb > original_size_kb:
st.error("Target size must be less than or equal to the original image size.")
else:
resized_image = resize_image(uploaded_file, target_size_kb=target_size_kb)
elif resize_option == "Select an option":
st.info("Please select a resize option to proceed.")
if resized_image:
st.image(resized_image, caption="Resized Image")
with io.BytesIO() as buffer:
resized_image.save(buffer, format="JPEG")
st.download_button(
label="Download Resized Image",
data=buffer.getvalue(),
file_name="resized_image.jpg",
mime="image/jpeg",
)