Skript, mis teeb midagi vajalikku hunniku graafikafailidega

From ICO wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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