File size: 3,856 Bytes
857baf6
 
 
207eb38
1cfc13a
207eb38
 
 
 
 
 
 
 
 
 
857baf6
 
 
 
 
 
 
 
 
207eb38
 
857baf6
207eb38
 
857baf6
207eb38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
857baf6
207eb38
 
 
 
 
 
 
857baf6
1cfc13a
 
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
import streamlit as st
from PIL import Image
import io
import traceback

def compress_image(image, format='webp', quality=85):
    try:
        img_byte_arr = io.BytesIO()
        image.save(img_byte_arr, format=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)
            
            st.subheader("Originalbild")
            st.image(original_image, caption="Ursprüngliches Bild")
            
            # Ursprungsgröße anzeigen
            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
            )
            
            # Nur ein Format wählbar
            target_format = st.sidebar.selectbox(
                "Zielformat", 
                ['webp', 'jpg', 'png']
            )
            
            if st.button("Bild optimieren"):
                try:
                    # Bild optimieren
                    optimized_image = compress_image(
                        original_image, 
                        format=target_format, 
                        quality=compression_quality
                    )
                    
                    if optimized_image:
                        # Speichern im Speicher
                        img_byte_arr = io.BytesIO()
                        optimized_image.save(img_byte_arr, format=target_format.upper(), quality=compression_quality)
                        img_byte_arr.seek(0)
                        
                        # Größenvergleich
                        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}%")
                        
                        # Download-Button
                        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}"
                        )
                    else:
                        st.error("Bildoptimierung fehlgeschlagen")
                
                except Exception as e:
                    st.error(f"Fehler bei Bildoptimierung: {e}")
                    st.error(traceback.format_exc())
        
        except Exception as e:
            st.error(f"Fehler beim Laden des Bildes: {e}")
            st.error(traceback.format_exc())

if __name__ == "__main__":
    main()