Skript, mis teeb midagi vajalikku hunniku graafikafailidega: Difference between revisions
From ICO wiki
Jump to navigationJump to search
Line 5: | Line 5: | ||
Selleks järgmine bashi skript: | Selleks järgmine bashi skript: | ||
<source lang="bash"> | |||
#!/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 | |||
</source> |
Revision as of 02:03, 28 January 2011
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