Skript, mis teeb midagi vajalikku hunniku graafikafailidega: Difference between revisions
From ICO wiki
Jump to navigationJump to search
No edit summary |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
Tekkis lausa praktiline vajadus lahendada järgnev probleem: | Tekkis lausa praktiline vajadus lahendada järgnev probleem: | ||
Line 7: | Line 6: | ||
<source lang="bash"> | <source lang="bash"> | ||
#!/bin/bash | #!/bin/bash | ||
# convimg.sh, Autor: Siim Liivand AK41 | |||
# Vastavalt vajadusele muudetavad väärtused: | # Vastavalt vajadusele muudetavad väärtused: | ||
Line 24: | Line 24: | ||
echo "ühesuguste mõõtmetega ja etteantud punktitihedusega ($DPI dpi) .$RESTYPE failideks" | echo "ühesuguste mõõtmetega ja etteantud punktitihedusega ($DPI dpi) .$RESTYPE failideks" | ||
echo -e "\nVõimalikud käsurea parameetrid:" | echo -e "\nVõimalikud käsurea parameetrid:" | ||
echo " | echo "$(basename $0) [algfailide kataloog [resultaatfailide kataloog]]" | ||
echo -e "\nVaikimisi loetakse faile aktiivsest kataloogist" | echo -e "\nVaikimisi loetakse faile aktiivsest kataloogist" | ||
echo "ning tulemus salvestatakse alamkataloogi 'result'." | echo "ning tulemus salvestatakse alamkataloogi 'result'." | ||
Line 47: | Line 47: | ||
# Kontrollime, kas töökataloog eksisteerib | # Kontrollime, kas töökataloog eksisteerib | ||
if [ ! -d "$WORKDIR" ]; then | if [ ! -d "$WORKDIR" ]; then | ||
echo "VIGA: Pole sellist kataloogi: $ | echo "VIGA: Pole sellist kataloogi: $WORKDIR" | ||
exit 1 | exit 1 | ||
fi | fi | ||
Line 70: | Line 70: | ||
mkdir $RESDIR | mkdir $RESDIR | ||
if [ $? -ne 0 ]; then | if [ $? -ne 0 ]; then | ||
echo " | echo "VIGA kataloogi $RESDIR loomisel!" | ||
exit 1 | exit 1 | ||
fi | fi | ||
Line 101: | Line 101: | ||
(( MY = MY>RX?MY:RX )) | (( MY = MY>RX?MY:RX )) | ||
fi | fi | ||
echo -n "." | if [ $((COUNT % 10)) -eq 0 ]; then | ||
echo -n "." # väljastame ekraanile punkte, et kasutaja näeks, et midagi toimub | |||
fi | |||
done | done | ||
Line 112: | Line 114: | ||
# Loome tühjad valged maksimaalmõõtmetes taustad, mille lisame igale pildile | # Loome tühjad valged maksimaalmõõtmetes taustad, mille lisame igale pildile | ||
convert | convert -size ${MX}x$MY xc:white -density ${DPI}x$DPI -monochrome $TMPDIR/bg_0.png # portrait | ||
convert | convert -size ${MY}x$MX xc:white -density ${DPI}x$DPI -monochrome $TMPDIR/bg_1.png # landscape | ||
# Siit algab tegelik konverteerimine | # Siit algab tegelik konverteerimine | ||
Line 120: | Line 122: | ||
let "COUNT = $COUNT + 1" | let "COUNT = $COUNT + 1" | ||
FILENAME=$(basename $FILE) | FILENAME=$(basename $FILE) | ||
echo -n "$FILENAME " | |||
convert -strip -monochrome $FILE -density ${DPI}x$DPI - | \ | convert -strip -monochrome $FILE -density ${DPI}x$DPI - | \ | ||
composite -gravity center - $TMPDIR/bg_${SHAPE[$COUNT]}.png $RESDIR/${FILENAME%.*}.$RESTYPE | composite -monochrome -gravity center - $TMPDIR/bg_${SHAPE[$COUNT]}.png $RESDIR/${FILENAME%.*}.$RESTYPE | ||
done | done | ||
Line 136: | Line 138: | ||
exit 0 | exit 0 | ||
</source> | </source> |
Latest revision as of 13:08, 28 January 2011
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