Skript, mis teeb midagi vajalikku hunniku graafikafailidega

From ICO wiki
Jump to navigationJump to search

Lahendamist vajav probleem

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

# 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 "convimg.sh [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: $1"
   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 
   echo -n "."		# väljastame ekraanile punkte, et kasutaja näeks, et midagi toimub
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 -monochrome -size ${MX}x$MY xc:white -density ${DPI}x$DPI $TMPDIR/bg_0.png	# portrait
convert -monochrome -size ${MY}x$MX xc:white -density ${DPI}x$DPI $TMPDIR/bg_1.png	# landscape

# Siit algab tegelik konverteerimine
COUNT=0
for FILE in ${FILES[@]}; do
   let "COUNT = $COUNT + 1" 
   FILENAME=$(basename $FILE)
   convert -strip -monochrome $FILE -density ${DPI}x$DPI - | \
   composite -gravity center - $TMPDIR/bg_${SHAPE[$COUNT]}.png $RESDIR/${FILENAME%.*}.$RESTYPE
   echo -n "$FILENAME "
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