Samstag, 23. Februar 2008

Bashhacker Part1: rescale.sh

Sowas aber auch, da hat man ne ganze ladung von Bildern auf der Festplatte herumliegen, die alle viel zu groß sind und dementsprechend Platz verschwenden. Man könnte daher gehen und jedes einzelene Icon rechtsklicken und mit dem kde Servicemenu
http://kde-apps.org/content/show.php/Photo+resize?content=61981. dann entsprechend bearbeiten. Das funktioniert aber alles andere als gut und hat zudem den Nachteil, dass man keine Auswahlmöglichkeiten hat, was die neue Größe angeht. Außerdem wird das Bild unwiederbringlich gelöscht, was man ja auch nicht unbedingt will.

Kurz in die Kommandozeile ein apropos ebgeschickt und herauskam ein Program was sich convert nennt und Teil von ImageMagick ist. Und dieses nette Script, das ich geschrieben habe macht es noch einfacher ImageMagick zu benutzen. Es ist prinzipiell ein Wrapper-Script, das sich zusaetlich um die Erkennung des Dateitypen kuemmert, den Benutzer vor unsinnigen Eingaben schuetzt, sowie die Bearbeitung von einer hohen Anzahl an Bildern ermoeglicht.

Code:
#!/bin/bash

#script to easyly mass rescale a colleection of jpeg and other picture formats supported by
#ImageMagick

#VARS
NO_CONVERT=33
NO_ARG=65
WRONG_SIZE=80
#VARS


check_convert () #convert is a function for manipultating images. it comes with ImageMagick
{
VERSION=$(convert -version 2> /dev/null echo "-" )

if [[ $VERSION == "-" ]]
then
echo "ImageMagick seemed not to be installed"
echo "Please install ImageMagick and rerun again."
echo "Script exits now."
drop_failure
exit $NO_CONVERT
else
echo "found $VERSION"
drop_ok
check_arg
fi
}


check_arg ()
{
if [ -z $PIC ] 2> /dev/null
then
echo "You must at least select one file "
echo "Usage: `basename $0` \"[jpeg] [bmp] [gif] [png] [tif]\" "
drop_failure
exit $NO_ARG
else
echo "These Pictures have been selected for rescale"

for pic in $PIC
do
echo $pic
done

drop_ok
geometry
fi
}


geometry ()
{

read -p "Please specify the new horizontal size:" HOR
read -p "Please specify the new vertical size:" VERT

check_geometry
}

#check whether the input variables are valid integers

check_geometry ()
{
PIXEL=$(( $HOR * $VERT )) PIXEL=0

if [ $PIXEL -eq 0 ]
then
echo "$HOR"x"$VERT" "is not a geometirc size"
drop_failure
exit $WRONG_SIZE
else
main
fi
}


main ()
{
for pic in $PIC
do
unset PICS_S
PICS_S=$(identify -verbose $picgrep Geometry) PICS_S="-"

if [ $PICS_S == "-" ] 2> /dev/null
then
echo "$pic seems not to have a valid format"
echo -e '\E[33mskipped'; tput sgr0
else
unset OLD_GEO
unset A
unset OLD_HOR
unset OLD_VERT
unset OLD_PIXEL

OLD_GEO=$(echo ${PICS_S##* })
A=$(echo ${OLD_GEO%%x*})
declare -i OLD_HOR=$(echo ${A##* })
declare -i OLD_VERT=$(echo ${PICS_S##*x})
OLD_PIXEL=$(( $OLD_VERT * $OLD_HOR ))

if [[ $PIXEL -ge $OLD_PIXEL ]]
then
echo "The pic allready has $OLD_PIXEL pixel but you want to rescale to $PIXEL pixel, which is greater or equal than the original size." #One line
echo -e '\E[33mskipped'; tput sgr0
else
convert $pic -verbose -scale "$HOR"x"$VERT" rescale_new-$pic
fi

fi
done
}


drop_ok ()
{
echo -e '\t \t \t \t \E[32mok'; tput sgr0
}


drop_failure ()
{
echo -e '\t \t \t \t \E[31mfailure'; tput sgr0
}


PIC=$*

case $1 in
-i)
for pic in $PIC
do
identify -verbose $pic 2> /dev/null grep Geometry 2> /dev/null && ls $pic
done

;;
*)

check_convert
esac


exit 0

Pittfalls: Achtung an einigen Stellen muss das was hier in 2 Zeilen untergebracht ist, in einer Zeile stehen. Aber die Einrückungen sollten klar machen, welche Teile das sind.

Noch zu tun: Möglicherweise ist es besser das Kommando file für die Überprüfung, ob eine Datei ein Bild ist oder nicht, zu verwenden.

Zusätzliche Informationen: Das Script wird mit den Dateinamen des Bildes bzw. der Bilder aufgerufen. Globbing und Wildcrards sind dabei erlaubt. Es überspringt Dateien die keine Bilder sind. Angenommen Du hast einen Ordner "durchaneinander", mit sagen wir 240 Bilder und einen ganzen haufen anderer Dateien. Dann kannst Du einfach das Script mit: rescale * aufrufen. Die Option -i erlaubt es Dir die Bilder zu Scannen, falls Du die Originalgröße des Bildes nicht kennst.

T#

Keine Kommentare:

Kommentar veröffentlichen

Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.