File size: 4,766 Bytes
6a3bfec
 
 
 
 
 
 
 
b15e399
 
 
6a3bfec
b15e399
6a3bfec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c782af6
 
b15e399
c782af6
6a3bfec
c782af6
6a3bfec
 
 
 
 
 
 
 
 
 
 
c782af6
 
 
6a3bfec
 
c782af6
6a3bfec
 
6fb7620
6a3bfec
6fb7620
 
 
6a3bfec
 
6fb7620
6a3bfec
 
 
 
 
 
 
6fb7620
 
6a3bfec
 
b15e399
 
 
6a3bfec
b15e399
6a3bfec
 
6fb7620
 
6a3bfec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6fb7620
 
6a3bfec
 
 
 
 
 
 
 
 
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import streamlit as st
from PIL import Image
import io
import traceback
import time

def compress_image(image, format='webp', quality=85):
    try:
        # Korrektur: Wandle 'jpg' in 'jpeg' um
        save_format = 'jpeg' if format.lower() == 'jpg' else format
        
        img_byte_arr = io.BytesIO()
        image.save(img_byte_arr, format=save_format.upper(), quality=quality)
        img_byte_arr.seek(0)
        return Image.open(img_byte_arr)
    except Exception as e:
        st.error(f"Fehler bei Bildkompression: {e}")
        st.error(traceback.format_exc())
        return None

def main():
    st.title("Bild Optimierungs-Tool")
    
    st.sidebar.header("Optimierungseinstellungen")
    
    uploaded_file = st.file_uploader("Wählen Sie ein Bild", type=['jpg', 'png', 'jpeg', 'webp'])
    
    if uploaded_file is not None:
        try:
            original_image = Image.open(uploaded_file)
            
            # Aktuelles Format ermitteln
            current_format = original_image.format.lower() if original_image.format else uploaded_file.name.split('.')[-1].lower()
            current_format = 'jpeg' if current_format == 'jpg' else current_format
            
            st.subheader("Originalbild")
            st.image(original_image, caption=f"Ursprüngliches Bild ({current_format.upper()})")
            
            original_size_bytes = len(uploaded_file.getvalue())
            st.write(f"Ursprüngliche Bildgröße: {original_size_bytes} Bytes")
            
            compression_quality = st.sidebar.slider(
                "Kompressionsqualität", 
                min_value=1, 
                max_value=100, 
                value=85
            )
            
            # Zielformate ohne aktuelles Format
            target_formats = [fmt for fmt in ['webp', 'jpg', 'png'] if fmt != current_format]
            
            target_format = st.sidebar.selectbox(
                "Zielformat", 
                target_formats
            )
            
            st.warning("⚠️ Bitte klicken Sie NUR EINMAL auf 'Bild optimieren'!")
            
            progress_bar = st.progress(0)
            
            if st.button("Bild optimieren"):
                try:
                    progress_bar.progress(20)
                    time.sleep(0.5)
                    
                    optimized_image = compress_image(
                        original_image, 
                        format=target_format, 
                        quality=compression_quality
                    )
                    
                    progress_bar.progress(60)
                    time.sleep(0.5)
                    
                    if optimized_image:
                        # Korrektur: Speichern mit korrektem Format
                        save_format = 'jpeg' if target_format.lower() == 'jpg' else target_format
                        
                        img_byte_arr = io.BytesIO()
                        optimized_image.save(img_byte_arr, format=save_format.upper(), quality=compression_quality)
                        img_byte_arr.seek(0)
                        
                        progress_bar.progress(100)
                        time.sleep(0.5)
                        
                        optimized_size_bytes = img_byte_arr.getbuffer().nbytes
                        compression_ratio = (1 - optimized_size_bytes / original_size_bytes) * 100
                        
                        st.subheader("Optimierungsergebnisse")
                        col1, col2 = st.columns(2)
                        
                        with col1:
                            st.image(optimized_image, caption=f"Optimiert ({target_format.upper()})")
                        
                        with col2:
                            st.write(f"Ursprüngliche Größe: {original_size_bytes} Bytes")
                            st.write(f"Optimierte Größe: {optimized_size_bytes} Bytes")
                            st.write(f"Kompressionsrate: {compression_ratio:.2f}%")
                        
                        st.download_button(
                            label=f"Download {target_format.upper()}",
                            data=img_byte_arr,
                            file_name=f"optimized_image.{target_format}",
                            mime=f"image/{target_format}"
                        )
                    
                    progress_bar.empty()
                
                except Exception as e:
                    st.error(f"Fehler bei Bildoptimierung: {e}")
                    progress_bar.empty()
        
        except Exception as e:
            st.error(f"Fehler beim Laden des Bildes: {e}")

if __name__ == "__main__":
    main()