ahmedumeraziz commited on
Commit
0f09ffa
·
verified ·
1 Parent(s): 6a8f4ed

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +114 -31
app.py CHANGED
@@ -1,37 +1,120 @@
1
- import gradio as gr
 
 
 
2
  from PIL import Image
3
  import io
 
 
4
 
5
- def optimize_image(image, quality=70, width=None, height=None):
6
- # Convert to RGB to ensure compatibility
7
- image = image.convert("RGB")
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
- # Resize if width and/or height provided
10
- if width or height:
11
- orig_width, orig_height = image.size
12
- width = int(width) if width else orig_width
13
- height = int(height) if height else orig_height
14
- image = image.resize((width, height))
15
-
16
- # Save optimized image to buffer
17
- buffer = io.BytesIO()
18
- image.save(buffer, format="JPEG", optimize=True, quality=quality)
19
- buffer.seek(0)
20
-
21
- return Image.open(buffer)
22
-
23
- demo = gr.Interface(
24
- fn=optimize_image,
25
- inputs=[
26
- gr.Image(type="pil"),
27
- gr.Slider(10, 100, value=70, label="Compression Quality"),
28
- gr.Number(label="Resize Width (optional)", value=None),
29
- gr.Number(label="Resize Height (optional)", value=None)
30
- ],
31
- outputs=gr.Image(type="pil"),
32
- title="Image Optimizer Pro",
33
- description="Upload an image to compress and resize it. Powered by Pillow and Gradio."
34
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
  if __name__ == "__main__":
37
- demo.launch()
 
1
+ # Image optimization tool
2
+ # Copyright Volkan Kücükbudak
3
+ # Source https://github.com/VolkanSah/image-optimizer/
4
+ import streamlit as st
5
  from PIL import Image
6
  import io
7
+ import traceback
8
+ import time
9
 
10
+ def compress_image(image, format='webp', quality=85):
11
+ try:
12
+ # Korrektur: Wandle 'jpg' in 'jpeg' um
13
+ save_format = 'jpeg' if format.lower() == 'jpg' else format
14
+
15
+ # Korrektur: Quality-Wert wird umgekehrt angewendet
16
+ adjusted_quality = 101 - quality # Dies dreht die Skala um
17
+
18
+ img_byte_arr = io.BytesIO()
19
+ image.save(img_byte_arr, format=save_format.upper(), quality=adjusted_quality)
20
+ img_byte_arr.seek(0)
21
+ return Image.open(img_byte_arr)
22
+ except Exception as e:
23
+ st.error(f"Image compression error: {e}")
24
+ st.error(traceback.format_exc())
25
+ return None
26
 
27
+ def main():
28
+ st.title("Image optimization tool")
29
+
30
+ st.sidebar.header("Optimization settings")
31
+
32
+ uploaded_file = st.file_uploader("Select an image", type=['jpg', 'png', 'jpeg', 'webp'])
33
+
34
+ if uploaded_file is not None:
35
+ try:
36
+ original_image = Image.open(uploaded_file)
37
+
38
+ current_format = original_image.format.lower() if original_image.format else uploaded_file.name.split('.')[-1].lower()
39
+ current_format = 'jpeg' if current_format == 'jpg' else current_format
40
+
41
+ st.subheader("Original image")
42
+ st.image(original_image, caption=f"Original image ({current_format.upper()})")
43
+
44
+ original_size_bytes = len(uploaded_file.getvalue())
45
+ st.write(f"Original image size: {original_size_bytes} Bytes")
46
+
47
+ compression_quality = st.sidebar.slider(
48
+ "Compression quality (100 = best quality, 1 = smallest file)",
49
+ min_value=1,
50
+ max_value=100,
51
+ value=85
52
+ )
53
+
54
+ target_formats = [fmt for fmt in ['webp', 'jpg', 'png'] if fmt != current_format]
55
+
56
+ target_format = st.sidebar.selectbox(
57
+ "Target format",
58
+ target_formats
59
+ )
60
+
61
+ st.warning("⚠️ Please click 'Optimize Image' ONLY ONCE'!")
62
+
63
+ progress_bar = st.progress(0)
64
+
65
+ if st.button("Optimize image"):
66
+ try:
67
+ progress_bar.progress(20)
68
+ time.sleep(0.5)
69
+
70
+ optimized_image = compress_image(
71
+ original_image,
72
+ format=target_format,
73
+ quality=compression_quality
74
+ )
75
+
76
+ progress_bar.progress(60)
77
+ time.sleep(0.5)
78
+
79
+ if optimized_image:
80
+ save_format = 'jpeg' if target_format.lower() == 'jpg' else target_format
81
+
82
+ img_byte_arr = io.BytesIO()
83
+ optimized_image.save(img_byte_arr, format=save_format.upper(), quality=101-compression_quality)
84
+ img_byte_arr.seek(0)
85
+
86
+ progress_bar.progress(100)
87
+ time.sleep(0.5)
88
+
89
+ optimized_size_bytes = img_byte_arr.getbuffer().nbytes
90
+ compression_ratio = (1 - optimized_size_bytes / original_size_bytes) * 100
91
+
92
+ st.subheader("Optimization results")
93
+ col1, col2 = st.columns(2)
94
+
95
+ with col1:
96
+ st.image(optimized_image, caption=f"Optimized ({target_format.upper()})")
97
+
98
+ with col2:
99
+ st.write(f"Original size: {original_size_bytes} Bytes")
100
+ st.write(f"Optimized size: {optimized_size_bytes} Bytes")
101
+ st.write(f"Compression rate: {compression_ratio:.2f}%")
102
+
103
+ st.download_button(
104
+ label=f"Download {target_format.upper()}",
105
+ data=img_byte_arr,
106
+ file_name=f"optimized_image.{target_format}",
107
+ mime=f"image/{target_format}"
108
+ )
109
+
110
+ progress_bar.empty()
111
+
112
+ except Exception as e:
113
+ st.error(f"Image optimization error: {e}")
114
+ progress_bar.empty()
115
+
116
+ except Exception as e:
117
+ st.error(f"Error loading image: {e}")
118
 
119
  if __name__ == "__main__":
120
+ main()