... gegen Computerkopfschmerzen

macOS: Fotos komprimieren

Automator-Skript zum Komprimieren von Fotos (jpg-Format) in einem bestimmten Ordner auf eine maximale vorgegebene Größe.

Schritte des Arbeitsablaufes

  1. Ordner auswählen

    Ordner auswählen

  2. Dateigröße wählen:

    Zielwert in kB

  3. Ergebnis: Das Protokoll wird in einem TextEdit-Dokument ausgegeben:

    Ergebnis mit alter und neuer Dateigröße


Inhalt des Automator-Arbeitsablaufes


Hier ist ein Bildschirmfoto des Arbeitsablaufes:

Automator-Ablauf Teil 1
Automator-Ablauf Teil 2

In Schritt 3 und 5 ist unter Optionen der Punkt Eingabe dieser Aktion ignorieren angehakt.
Im Schritt Shell-Skript ausführen ist unter Eingabe übergeben: Als Argumente ausgewählt.

Im Arbeitsablauf heißt der Default-Ordner aktuelle Verkäufe und die Default-Größe ist 250 kB. Beide Variablen können während der Ausführung in einem Eingabefenster geändert werden.

Shell-Skript

Dies ist das verwendete Shell-Skript (ein Beispiel für die Verwendung von sed, awk, while, eval)
($1: Zielordner, $2: Zielgröße der Dateien).
#sed: Leerzeichen aus Dateipfad entfernen, eval: cd mit einer Variablen richtig ausführen
eval cd "`echo $1 |sed 's![[:space:]]!\\\ !g'`"
#echo `pwd`
# jpg-Dateien in "Dateien" schreiben
ls *.jpg > Dateien
ls *.jpeg >> Dateien
ls *.JPEG >> Dateien
ls *.JPG >> Dateien
file='Dateien'
# Schleife über alle jpgs
while read line; do
echo " "
echo "aktuelle Datei: $line"
echo "================================="
line_sav=$(echo $line)_sav
# aktuelle Datei wegsichern
`cp -p $line $line_sav`
# echo "Datei kopiert auf: $line_sav"
# Startkompressionswert setzen
sipssize=20
# echo $sipssize
# Merker für kleinste Dateigröße
currentBest=0
# Startgröße der Datei ermitteln
file_size=`ls -sk $line | awk '{ print $1 }'`
echo "Größe der Datei: $file_size kB"
# Ist die Datei größer als "maximale Größe der Datei"? -> kleiner machen
while [ $file_size -gt $2 ]; do
# sips anwenden, _sav als Quelle
`sips -s formatOptions $sipssize $line_sav --out $line &>/dev/null`
# echo "ausgeführt: sips -s $sipssize $line_sav --out $line"
# neue Größe ermitteln
file_size=`ls -sk $line | awk '{ print $1 }'`
# echo "Größe der Datei mit $sipssize % Qualität: $file_size"
if [ $currentBest -eq $file_size ];
then
echo "Die Datei läßt sich nicht weiter verkleinern."
break
# wenn sie mehr als 85 % kleiner als gewünscht ist, wieder größer machen
elif [ $((100*$file_size/$2)) -lt 85 ];
then
# echo "Das wird zu klein:" $file_size
# Qualität heraufsetzen
sipssize=$[ sipssize + 8 ]
file_size=`ls -sk $line_sav | awk '{ print $1 }'`
else
sipssize=$[ sipssize - 5 ]
if [ $sipssize -lt 1 ];
then
echo "beendet mit Minimalwert $[ sipssize + 5 ] %"
break
fi
fi
currentBest=$file_size
# echo " Neue sips-Größe: $sipssize kB"
done
rm $line_sav
echo "neue Dateigröße:" $file_size
done <$file
rm Dateien

In seltenen Fällen hängt sich das Skript in einer Endlosschleife auf, weil die Datei mal zu klein und mal zu groß ist und dieser Fall nicht abgefangen wird.

Der Arbeitsablauf ist als Dienst eingebunden und kann aus jedem Programm über das Menü Dienste aufgerufen werden:
Ablauf als Dienst




Betriebssystem macOS Sierra
Betriebssystem macOS High Sierra
Automator Version 2.7 (428)
Automator Version 2.8 (444.7)