import streamlit as st from PIL import Image import io def resize_image(image, target_size_kb=None, quality=85): """Resizes and compresses an image.""" img = Image.open(image) img_byte_arr = io.BytesIO() img.save(img_byte_arr, format='JPEG', quality=quality) current_size_kb = len(img_byte_arr.getvalue()) / 1024 # Resize based on target size (if provided) if target_size_kb: while current_size_kb > target_size_kb and quality > 10: quality -= 5 img_byte_arr = io.BytesIO() img.save(img_byte_arr, format='JPEG', quality=quality) current_size_kb = len(img_byte_arr.getvalue()) / 1024 else: # Resize based on quality pass # No resizing for quality-based option img = Image.open(img_byte_arr) return img st.title("Image Resizer") st.write("Resize and compress your images!") # Upload image uploaded_file = st.file_uploader("Choose an Image:", type=["jpg", "jpeg", "png"]) if uploaded_file is not None: # Option selection for resizing resize_option = st.selectbox("Resize Option:", ("Percentage Quality", "Desired Output Size")) if resize_option == "Percentage Quality": # User input for quality quality = st.slider("Quality (%)", min_value=10, max_value=100, value=85) elif resize_option == "Desired Output Size": # Options for size units size_unit_options = ("KB", "MB") size_unit = st.selectbox("Size Unit", size_unit_options) # User input for size target_size = st.number_input("Target Size", min_value=1) # Convert target size to KB based on unit if size_unit == "MB": target_size_kb = target_size * 1024 else: target_size_kb = target_size # Process and display image if uploaded_file and (quality or target_size_kb): resized_image = resize_image(uploaded_file, target_size_kb, quality) st.image(resized_image, caption="Resized Image") # Download link with io.BytesIO() as buffer: resized_image.save(buffer, format="JPEG") download_link = st.download_button( label="Download Resized Image", data=buffer.getvalue(), file_name="resized_image.jpg", mime="image/jpeg", ) # Requirements (req.txt) # Since the app uses only built-in libraries (streamlit and Pillow), there's no need for an external requirements file. # However, if you plan to use additional libraries, you can create a req.txt file listing them. # For example: # streamlit # Pillow