Image Resize

Aus aktuellem Anlass hier ein kleines Tool zum Skalieren von Bildern, eine Aufgabe, die immer mal wieder anfällt, insbesondere dann, wenn man ein wenig Webdesign betreibt. In stark reduzierter Form existierte das schon lange in meinem Fundus, aber zuletzt war es mir dann doch zuviel geworden, den Einzeiler für jeden Anwendungsfall neu anzupassen 😀 .
(Und ja, ich weiss: es gibt prima GUI Tools für diese Aufgabe, die ich auch gerne einsetze, insbesondere z.B. SIR – aber manchmal ist man auf der Kommandozeile einfach schneller…).

Also ein wenig in der bash-Trickkiste gekramt und das Ganze soweit optimiert, dass es ohne Anpassung die meisten Aufgaben bzgl. der automatischen Skalierung von Bilddateien erledigen kann, mit sinnvollen Default-Werten.
Und, ganz wichtig, eine Option, alle Bilder nicht nur ‚auf einen Schlag‘, sondern auch so zu konvertieren, dass sie nachher alle die gleiche Höhe (oder Breite, je nach Wunsch) haben, auch wenn sie vorher jeweils ein anderes Breite/Höhe Verhältnis haben. Das ist nützlich z.B. für Fotogalerien oder Slider.
Der langen Rede kurzer Sinn – hier ist der Source-Code:

#!/bin/bash
# Werner Joss, 17.02.2018
# resize Images using ImageMagick convert (not restricted to jpg format)
# defaults are: file pattern=*.jpg, width=1024, height=768
# usage: jpg-resize.sh [-w width] [-h height] [-p pattern]
# will convert all files matching $pattern to $width x $height
# note: omitting -h or -w option will resize to same value for specified option !

#	do not preset $width and $height here, see code after getopts block !
pattern="*.jpg"	# default file pattern
prefix="c_"	#	Prefix for resized files - set to empty to replace original files!

while getopts ":w:h:p:" opt; do
	case $opt in
	w)
		width=$OPTARG
		;;
	h)
		height=$OPTARG
		;;
	p)
		pattern=$OPTARG
		;;
	\?)
		echo "Invalid option: -$OPTARG" >&2
		exit 1
		;;
	:)
		echo "Option -$OPTARG requires an argument." >&2
		exit 1
		;;
	esac
done
if [ -z $width ] && [ -z $height ]; then	# defaults go here
	width=1024
	height=768
fi
files=`ls $pattern`
for file in $files
do
	newfile=$prefix$file
	echo resizing $file - $newfile
	if [ -z $width ]; then
		convert $file -resize x$height $newfile
	else
		if [ -z $height ]; then
			convert $file -resize "$width"x $newfile
		else
			convert $file -resize "$width"x$height $newfile
		fi
	fi
done