Skip to content

Instantly share code, notes, and snippets.

@Phlow
Created September 10, 2024 15:22
Show Gist options
  • Save Phlow/13b2c2e3210424252c40ee1e0404596c to your computer and use it in GitHub Desktop.
Save Phlow/13b2c2e3210424252c40ee1e0404596c to your computer and use it in GitHub Desktop.
Image Optimizer – Dieses Skript überwacht einen Ordner auf neue Bild-Dateien (JPEG, PNG) und optimiert diese automatisch.
#!/bin/bash
# Bildoptimierungs-Skript
# ------------------------
#
# Dieses Skript überwacht einen Ordner auf neue Bild-Dateien (JPEG, PNG) und optimiert diese automatisch.
#
# Installation der benötigten Programme:
#
# Für macOS mit Homebrew:
# brew install fswatch webp guetzli pngquant
#
# Für Linux (Ubuntu/Debian):
# sudo apt-get update
# sudo apt-get install fswatch webp guetzli
#
# Für pngquant auf Linux:
# wget https://pngquant.org/pngquant-2.12.5-linux.tar.gz
# tar xzf pngquant-2.12.5-linux.tar.gz
# cd pngquant-2.12.5-linux
# sudo cp pngquant /usr/local/bin
#
# Hinweis: Die Versionsnummer von pngquant kann variieren.
# Prüfen Sie die aktuelle Version auf https://pngquant.org
#
# Für andere Betriebssysteme oder Paketmanager, bitte die
# entsprechenden Installationsanweisungen der jeweiligen Tools befolgen.
# Bildschirm leeren
clear
# Überprüfe Bash-Version
echo "Ihre Bash-Version ist: $BASH_VERSION"
echo "Dieses Skript ist für Bash 3.2 und höher optimiert."
echo ""
# Ordner definieren
WATCH_DIR="/Users/moritz/Desktop/image_optimized"
ORIGINAL_DIR="$WATCH_DIR/Originale"
WEBP_DIR="$WATCH_DIR/WebP"
JPG_PNG_DIR="$WATCH_DIR/JPG_PNG"
PROCESSED_DIR="$WATCH_DIR/Processed"
# Benötigte Ordner erstellen
mkdir -p "$ORIGINAL_DIR" "$WEBP_DIR" "$JPG_PNG_DIR" "$PROCESSED_DIR"
# Globale Variablen für Speicherplatzeinsparung
TOTAL_ORIGINAL_SIZE=0
TOTAL_WEBP_SIZE=0
TOTAL_GUETZLI_SIZE=0
# Startmeldung ausgeben
echo "--------------------------------------------------"
echo "Bildoptimierungs-Skript gestartet"
echo "--------------------------------------------------"
echo "Das Skript überwacht den Ordner: $WATCH_DIR"
echo "$WATCH_DIR"
echo "und optimiert automatisch neue Bild-Dateien."
echo ""
echo "Warte auf neue Dateien..."
echo "--------------------------------------------------"
echo ""
# Funktion für Statusmeldungen
print_status() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Funktion zur Ermittlung der Dateigröße
get_file_size() {
stat -f%z "$1"
}
# Funktion zur Umwandlung von Bytes in lesbare Größen
human_readable_size() {
local size=$1
local units=("B" "KB" "MB" "GB" "TB")
local unit=0
while [ $size -ge 1024 ] && [ $unit -lt 4 ]; do
size=$(( size / 1024 ))
unit=$(( unit + 1 ))
done
echo "$size ${units[$unit]}"
}
# Funktion zur Verarbeitung der Dateien
process_file() {
local file="$1"
local filename=$(basename "$file")
local extension=$(echo "${filename##*.}" | tr '[:upper:]' '[:lower:]')
local name="${filename%.*}"
# Prüfen, ob die Datei bereits verarbeitet wurde
if [ -f "$PROCESSED_DIR/$filename" ]; then
print_status "Datei bereits verarbeitet: $filename"
return
fi
print_status "Verarbeite Datei: $filename"
local original_size=$(get_file_size "$file")
TOTAL_ORIGINAL_SIZE=$((TOTAL_ORIGINAL_SIZE + original_size))
# Kopiere Original in den Originalordner
cp "$file" "$ORIGINAL_DIR/"
print_status "Original kopiert nach $ORIGINAL_DIR/"
# Konvertiere zu WebP
cwebp -q 90 "$file" -o "$WEBP_DIR/$name.webp" 2>/dev/null
if [ $? -eq 0 ]; then
print_status "WebP-Version erstellt in $WEBP_DIR/"
local webp_size=$(get_file_size "$WEBP_DIR/$name.webp")
TOTAL_WEBP_SIZE=$((TOTAL_WEBP_SIZE + webp_size))
else
print_status "Fehler beim Erstellen der WebP-Version"
fi
case "$extension" in
jpg|jpeg)
# Optimiere JPEG mit Guetzli
guetzli --quality 90 "$file" "$JPG_PNG_DIR/$filename" 2>/dev/null
if [ $? -eq 0 ]; then
print_status "JPEG optimiert mit Guetzli in $JPG_PNG_DIR/"
local guetzli_size=$(get_file_size "$JPG_PNG_DIR/$filename")
TOTAL_GUETZLI_SIZE=$((TOTAL_GUETZLI_SIZE + guetzli_size))
else
print_status "Fehler beim Optimieren des JPEG mit Guetzli"
fi
;;
png)
# Optimiere PNG
pngquant --quiet --quality=85-100 --skip-if-larger --strip --force --ext .png "$file"
if [ $? -eq 0 ]; then
mv "${file%.png}-fs8.png" "$JPG_PNG_DIR/$filename"
print_status "PNG optimiert mit pngquant in $JPG_PNG_DIR/"
local guetzli_size=$(get_file_size "$JPG_PNG_DIR/$filename")
TOTAL_GUETZLI_SIZE=$((TOTAL_GUETZLI_SIZE + guetzli_size))
else
print_status "Fehler beim Optimieren des PNG mit pngquant"
fi
;;
*)
print_status "Unbekanntes Dateiformat: $extension. Datei wird übersprungen."
rm "$file" # Entferne unbekannte Dateien
return
;;
esac
# Metadaten der Datei löschen
exiftool -all= "$PROCESSED_DIR/$filename"
print_status "Metadaten gelöscht für: $filename"
# Markiere die Datei als verarbeitet
touch "$PROCESSED_DIR/$filename"
# Entferne die originale Datei aus dem Überwachungsordner
rm "$file"
print_status "Originaldatei aus dem Überwachungsordner entfernt"
# Zusammenfassung nach jeder Datei ausgeben
print_summary
print_status "Verarbeitung abgeschlossen für: $filename"
echo "----------------------------------------"
}
# Funktion zur Ausgabe der Zusammenfassung
print_summary() {
local total_optimized_size=$((TOTAL_WEBP_SIZE + TOTAL_GUETZLI_SIZE))
local saved_space=$((TOTAL_ORIGINAL_SIZE - total_optimized_size))
local saved_percentage=$((saved_space * 100 / TOTAL_ORIGINAL_SIZE))
echo "----------------------------------------"
echo "Zusammenfassung der Optimierung:"
echo "Originalgröße: $(human_readable_size $TOTAL_ORIGINAL_SIZE)"
echo "Optimierte Größe (WebP): $(human_readable_size $TOTAL_WEBP_SIZE)"
echo "Optimierte Größe (Guetzli): $(human_readable_size $TOTAL_GUETZLI_SIZE)"
echo "Gesamt optimierte Größe: $(human_readable_size $total_optimized_size)"
echo "Eingesparter Speicherplatz: $(human_readable_size $saved_space) ($saved_percentage%)"
echo "----------------------------------------"
}
# Setze trap für die Ausgabe der Zusammenfassung beim Beenden
trap print_summary EXIT
# Überwache den Ordner, schließe dabei Unterordner aus
fswatch -0 --exclude "$ORIGINAL_DIR/.*" --exclude "$WEBP_DIR/.*" --exclude "$JPG_PNG_DIR/.*" --exclude "$PROCESSED_DIR/.*" "$WATCH_DIR" | while read -d "" event
do
if [[ "$event" =~ \.(jpg|jpeg|png)$ ]]; then
echo "Neue Datei erkannt: $event"
process_file "$event"
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment