schrumpf5.sh

Ich habe oft massig BIlder, die ich in der Auflösung der Camera von 4000×3000 Pixeln importiert habe, und will es schrumpfen, wobei ich es im Betrachter vielleicht schon gedreht habe, so dass es nun 3000×4000 Pixel ist, oder es ist beschnitten worden und hat 1762×964 Pixel und dennoch will ich es auf 1/5 eindampfen.

Dafür habe ich ein Script geschrieben, welches ich gerne unter der GPLv3-Lizenz hier weltexclusiv veröffentliche, bzw. in einem Github/Gist mit Zeilennummern und Syntaxhighlightening.

Das Programm erwartet eine zu schrumpfende Datei als Parameter, prüft ob der Name eine Datei ist, und ob diese auf JPG endet. Dann wird mit identify aus dem Paket ImageMagick die Auflösung ermittelt, und ein Fünftel der beiden Dimensionen ermittelt.

Bilder kleiner 10×10 Pixel werden nicht erzeugt, v.a. als Sicherheitsmaßnahme gegen Dateien, die gar keine Grafiken sind.

Das Skript kann auch in das Kontextmenue des Dateibrowsers eingefügt werden. Falls sich daran Interesse artikuliert könnte ich zeigen wie.

<code>

#!/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 2458×1524 2458×1524+0+0 8-bit DirectClass 1.488MB 0.000u 0:00.000

Ergbenis für resolution: 2458×1524

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 800×600 $file ${file/.JPG/.jpg} && rm $file

convert -resize ${xneu}x${yneu} „${file}“ „${file/.JPG/.jpg}“ # && rm $file

</code>

Die Beschränkung auf JPG müsste nicht sein – kommentiert man Zeile 35 mit „abbruch 3“ aus, dann konvertiert es auch GIF, TIFF, PNG und andere Grafikdateien, aber beim Umbenennen wird keiin JPG gefunden aus dem ein jpg werden könnte (Zeile 64, ganz unten), so dass die Zieldatei wie die Ausgangsdatei hieße – keine Ahnung ob convert das stillschweigen macht, oder die Arbeit dann verweigert. Also vorsichtig – Testen oder diese Zeile anpassen.

Man könnte auch die Endung ermitteln und eine kleingeschriebene Version der Endung für egal welche Datei ermitteln, aber da ich immer nur JPG-Dateien habe überlasse ich diese Verbesserung als Übung in bester Tradition dem geneigten Leser.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.