Spaces:
Sleeping
Sleeping
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() |