File size: 3,506 Bytes
7a0d1e4
 
 
 
daab883
 
 
 
 
 
 
7a0d1e4
daab883
7a0d1e4
e5a870d
 
 
 
 
daab883
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e5a870d
 
 
daab883
e5a870d
7a0d1e4
 
e5a870d
7a0d1e4
 
 
 
e5a870d
 
 
daab883
7a0d1e4
e5a870d
 
daab883
 
 
 
 
e5a870d
 
daab883
 
 
 
e5a870d
 
 
 
 
daab883
 
e5a870d
daab883
 
 
 
 
 
 
 
 
e5a870d
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
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",
            )