Skip to content

Instantly share code, notes, and snippets.

@Stefan-Wagner
Last active August 29, 2015 13:56
Show Gist options
  • Save Stefan-Wagner/9014389 to your computer and use it in GitHub Desktop.
Save Stefan-Wagner/9014389 to your computer and use it in GitHub Desktop.
#!/bin/bash
#
# (c) GPLv3
#
# schrumpf5.sh: Schrumpf ein Bild mit der Endung JPG auf 1/5 der Breite u. 1/5 der Höhe,
# also auf ein 1/25 der Fläche und benenne es von *JPG zu *jpg um dabei.
#
# Überschreibt eventuell schon existierende Dateien mit Namen jpg ohne Nachfrage
#
# Dateien mit falscher Endung (nicht JPG) werden überpedantisch zurückgewiesen.
#
# Verhalten für andere Grafikformate undefiniert
#
# Usage:
# schrumpf5.sh DSCF0001.JPG
# verkleinert die Datei auf beiden Achsen auf 1/5.
# Ein ganzes Verzeichnis verkleinern:
# find . -maxdepth 1 -name "*.JPG" -exec schrumpf5.sh {} ";"
#
# Depends:
# Hängt vom Programmpaket image-magick ab.
function abbruch {
case $1 in
1) echo "keine Datei" ;;
2) echo "Ungültiger x- oder y-Wert" ;;
3) echo "Dateiname endet nicht auf JPG" ;;
*) echo "falscher Fehler" ;;
esac
exit $1
}
file=$1
test -f "$file" || abbruch 1
if [ ${file: -3:3} != "JPG" ]; then abbruch 3; fi
# klappt nicht bei Dateinamen mit blank, tab, linefeed u.a. Whitespace im Namen
arr=($file)
# Ein Dateiname der blanks enthält wird problematisch, wenn man das nicht berücksichtigt.
# Für eine Datei "Das Leben des Brian" wird len zu 4, der Wortzahl
len=${#arr[@]}
# echo ${#arr[@]} ${arr[0]} ${arr[@]}
pos=$((len+2))
# echo -e len=$len"\n"pos=$pos
resolution=$(identify "$file" | awk "{print \$$pos}")
# echo resolution=$resolution
# Ausgabe identity:
# DSCF5700.JPG JPEG 2458x1524 2458x1524+0+0 8-bit DirectClass 1.488MB 0.000u 0:00.000
# Ergbenis für resolution: 2458x1524
# alles bis x inklusive löschen:
y=${resolution/*x/}
# 1524
# alles ab x inklusive löschen:
x=${resolution/x*/}
# 2458
# vor dem Dividieren /5 addieren wir 5, um zu einem akuraten Runden zu kommen, denn
# Integerarithmetik führt in der Shell nicht von selbst zum Runden, sondern zum Abschneiden.
# 14 und 16 durch 10 ergibt also jeweils 1, addieren wir vorher 5, so dividieren wir dann 19 o. 21 durch 10
# und kommen zu 1 und 2.
# echo "x=$x y=$y"
xneu=$(((x+5)/5))
yneu=$(((y+5)/5))
((xneu < 10 || yneu < 10)) && abbruch 2
# convert -resize 800x600 $file ${file/.JPG/.jpg} && rm $file
convert -resize ${xneu}x${yneu} "${file}" "${file/.JPG/.jpg}" # && rm $file
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment