File size: 3,192 Bytes
1ee6880
 
 
 
 
 
 
 
 
 
 
 
 
 
f2a3b89
1ee6880
 
f2a3b89
 
1ee6880
 
 
 
 
 
 
 
 
 
 
 
 
 
f2a3b89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1ee6880
f2a3b89
1ee6880
 
f2a3b89
 
 
 
 
 
 
 
 
 
 
 
 
1ee6880
f2a3b89
1ee6880
 
f2a3b89
1ee6880
f2a3b89
1ee6880
 
 
 
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
import gradio as gr
from PIL import Image
import io
import tempfile

def compress_image(input_image, output_format, quality=85):
    img_byte_arr = io.BytesIO()
    if output_format.upper() in ['JPEG', 'JPG']:
        input_image.save(img_byte_arr, format='JPEG', quality=quality)
    elif output_format.upper() == 'PNG':
        input_image.save(img_byte_arr, format='PNG', compress_level=int((100-quality)/10))
    elif output_format.upper() == 'WEBP':
        input_image.save(img_byte_arr, format='WEBP', quality=quality)
    
    img_byte_arr = img_byte_arr.getvalue()
    with tempfile.NamedTemporaryFile(delete=False, suffix=f'.{output_format.lower()}') as temp_file:
        temp_file.write(img_byte_arr)
        temp_file_path = temp_file.name
    
    return temp_file_path

def image_compression_interface(uploaded_image, output_format, quality):
    try:
        image = Image.open(uploaded_image)
        if image.mode in ("RGBA", "P") and output_format.upper() in ['JPEG', 'JPG', 'WEBP']:
            image = image.convert("RGB")
        
        compressed_image_path = compress_image(image, output_format, quality)
        return compressed_image_path
    
    except Exception as e:
        return str(e)

def get_current_size(compressed_image_path):
    try:
        with open(compressed_image_path, 'rb') as f:
            size = len(f.read())
        return f"Current Size: {size} bytes"
    except FileNotFoundError:
        return "Image not found"

def update_ui(uploaded_image, output_format, quality):
    try:
        image = Image.open(uploaded_image)
        if image.mode in ("RGBA", "P") and output_format.upper() in ['JPEG', 'JPG', 'WEBP']:
            image = image.convert("RGB")
        
        compressed_image_path = compress_image(image, output_format, quality)
        current_size = get_current_size(compressed_image_path)
        return [compressed_image_path, current_size]
    
    except Exception as e:
        return [str(e), None]

def create_gradio_interface():
    image_input = gr.File(label="Upload Image")
    output_format_input = gr.Dropdown(choices=["JPEG", "JPG", "PNG", "WEBP"], label="Select Output Format")
    quality_input = gr.Slider(minimum=1, maximum=100, step=1, value=85, label="Select Compression Quality")
    size_display = gr.Textbox(label="Current Size")

    def on_quality_change(quality):
        try:
            image = Image.open(uploaded_image.value)
            if image.mode in ("RGBA", "P") and output_format_input.value.upper() in ['JPEG', 'JPG', 'WEBP']:
                image = image.convert("RGB")
            
            compressed_image_path = compress_image(image, output_format_input.value, quality)
            current_size = get_current_size(compressed_image_path)
            return current_size
        except Exception as e:
            return str(e)

    quality_input.change(on_quality_change, inputs=[quality_input], outputs=size_display)

    gr.Interface(
        fn=update_ui,
        inputs=[image_input, output_format_input, quality_input],
        outputs=[gr.File(label="Download Compressed Image"), size_display],
    ).launch()

if __name__ == "__main__":
    create_gradio_interface()