Skript, mis teeb midagi vajalikku hunniku graafikafailidega
From ICO wiki
Tekkis lausa praktiline vajadus lahendada järgnev probleem:
On suur hunnik (jpeg-vormingus) graafikafaile, mis on sisse skanneeritud, suvaliselt cropitud, suure mahuga, 24-bit värvisügavusega... Need on tarvis konverteerida must-valgeteks (1-bit) ühesuguste mõõtmetega png-vormingus failideks. Seejuures tuleb jälgida, millised failid on nö portrait ja millised landscape kujul.
Selleks järgmine bashi skript:
#!/bin/bash
# convimg.sh, Autor: Siim Liivand AK41
# Vastavalt vajadusele muudetavad väärtused:
SRCTYPE=jpg # Algfailide tüübi faililaiend
RESTYPE=png # Resultaatfailide tüübi faililaiend
DPI=288 # Resultaatfailide punktitihedus
TMPDIR=/tmp # Ajutiste tööfailide asukoht
WORKDIR=. # Vaikimisi algfailide kataloog
RESDIR=result # Resultaatfailide kataloogi nimi
#======================================================================
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
echo "Skript töötleb etteantud kataloogis (vaikimisi aktiivses kataloogis)"
echo "asuvaid .$SRCTYPE laiendiga faile ning konverteerib nad kõik mustvalgeteks,"
echo "ühesuguste mõõtmetega ja etteantud punktitihedusega ($DPI dpi) .$RESTYPE failideks"
echo -e "\nVõimalikud käsurea parameetrid:"
echo "$(basename $0) [algfailide kataloog [resultaatfailide kataloog]]"
echo -e "\nVaikimisi loetakse faile aktiivsest kataloogist"
echo "ning tulemus salvestatakse alamkataloogi 'result'."
exit 0
fi
export LC_ALL=C
# Kontrollime, kas on paigaldatud tööks vajalik imagemagick pakett
apt-cache policy imagemagick | grep "Installed: (none)" > /dev/null
if [ $? -eq 0 ]; then
echo "VIGA: Skript vajab tööks imagemagick paketti!"
# apt-get update && apt-get install imagemagick -y
exit 1
fi
# Kui käsurea parameetrina on määratud töökataloog, siis omistame selle vastavale muutujale
if [ "$1" != "" ]; then
WORKDIR=$(dirname $1/dummy.file)
fi
# Kontrollime, kas töökataloog eksisteerib
if [ ! -d "$WORKDIR" ]; then
echo "VIGA: Pole sellist kataloogi: $WORKDIR"
exit 1
fi
# Kontrollime, kas töökataloogis on üldse sobivaid graafikafaile
ls $WORKDIR/*.$SRCTYPE > /dev/null
if [ $? -ne 0 ]; then
echo "VIGA: Kataloogis $WORKDIR ei ole .$SRCTYPE faile"
exit 1
fi
# Kui käsurea parameetrina on määratud resultaatfailide kataloog, siis omistame selle
# väärtuse vastavale muutujale, või vastasel juhul omistame vaikimisi kataloogi nime
if [ "$2" = "" ]; then
RESDIR=$WORKDIR/$RESDIR
else
RESDIR=$(dirname $2/dummy.file)
fi
# Kui resultaatfailide kataloogi ei eksisteeri, siis üritame selle luua
if [ ! -d "$RESDIR" ]; then
mkdir $RESDIR
if [ $? -ne 0 ]; then
echo "VIGA kataloogi $RESDIR loomisel!"
exit 1
fi
fi
# Siit algab imagemagicku põhiline tegevus piltide kallal
echo -n "Analüüsin pilte"
# Muutujate algväärtustamine
COUNT=0 # Piltide koguarv
MX=0 # Suurim horisontaalne pikslite arv
MY=0 # Suurim vertikaalne pikslite arv
# Järgnevas tsüklis leiame maksimaalsed piltide mõõtmed,
# millistele viime lõpuks kõigi piltide mõõtmed
# Lisaks määrame kindlaks, kas konkreetne pilt on 'portrait' või 'landscape' kujul
for FILE in $WORKDIR/*.$SRCTYPE
do
let "COUNT = $COUNT + 1"
RESO=$(identify $FILE | cut -d" " -f3)
RX=$(echo $RESO | cut -d"x" -f1)
RY=$(echo $RESO | cut -d"x" -f2)
(( SHAPE[COUNT] = RX>RY?1:0 )) # kas portrait või landscape?
FILES[$COUNT]=$FILE
if [ ${SHAPE[$COUNT]} == 0 ]; then # otsime suurimaid mõõtmeid
(( MX = MX>RX?MX:RX )) # see sõltub ka sellest,
(( MY = MY>RY?MY:RY )) # kas pilt on portrait või
else # landscape kujul
(( MX = MX>RY?MX:RY ))
(( MY = MY>RX?MY:RX ))
fi
if [ $((COUNT % 10)) -eq 0 ]; then
echo -n "." # väljastame ekraanile punkte, et kasutaja näeks, et midagi toimub
fi
done
unset RESO
echo -e "\nPilte kokku: $COUNT"
echo "Suurimad mõõtmed: ${MX}x${MY}px"
echo -n "Konverteerin: "
# Loome tühjad valged maksimaalmõõtmetes taustad, mille lisame igale pildile
convert -size ${MX}x$MY xc:white -density ${DPI}x$DPI -monochrome $TMPDIR/bg_0.png # portrait
convert -size ${MY}x$MX xc:white -density ${DPI}x$DPI -monochrome $TMPDIR/bg_1.png # landscape
# Siit algab tegelik konverteerimine
COUNT=0
for FILE in ${FILES[@]}; do
let "COUNT = $COUNT + 1"
FILENAME=$(basename $FILE)
echo -n "$FILENAME "
convert -strip -monochrome $FILE -density ${DPI}x$DPI - | \
composite -monochrome -gravity center - $TMPDIR/bg_${SHAPE[$COUNT]}.png $RESDIR/${FILENAME%.*}.$RESTYPE
done
rm $TMPDIR/bg_*.png > /dev/null # kõrvaldame ajutised failid
# Töö tehtud, kuvame kokkuvõtva info
echo -e "\n-----"
echo "$COUNT pilti konverteeritud"
PREVSIZE=$(du --apparent-size -S -c $WORKDIR/*.$SRCTYPE | grep 'total' | cut -f1 -s)
NEWSIZE=$(du --apparent-size -S -c $RESDIR/*.$RESTYPE | grep 'total' | cut -f1 -s)
echo "Maht enne konverteerimist $PREVSIZE (100%)"
echo "Maht peale konverteerimist $NEWSIZE ($(($NEWSIZE*100/$PREVSIZE))%)"
exit 0