imagemagick lánc
Elég sokszor írtam már az imagemagickről, ami az egyik legjobb parancssoros képszerkesztő eszköz.
Ha egy bonyolult imagemagick scriptet írok, akkor gyakran valami ilyen lesz a végeredmény:
#!/bin/bash
WIDTH=$(identify -ping -format "%w" $1)
HEIGHT=$(identify -ping -format "%h" $1)
convert -size ${WIDTH}x${HEIGHT} radial-gradient:black-white temp1.png
convert $1 -colorspace gray temp2.png
convert $1 temp1.png -compose Multiply -composite -normalize temp3.png
convert $1 temp2.png -compose Minus -composite temp4.png
convert temp4.png -auto-level -modulate 200 +dither -colors 2 -colorspace gray -contrast-stretch 0 temp5.png
convert temp5.png -blur 20x20 temp6.png
convert temp5.png -negate temp7.png
convert temp7.png -blur 20x20 temp8.png
convert temp8.png temp3.png -compose Multiply -composite temp9.png
convert temp6.png $1 -compose Multiply -composite temp10.png
convert temp9.png temp10.png -compose Plus -composite output.png
Az nem túl fontos, hogy mit csinál a script, de látszik, hogy 11 lépésből áll, közben rengeteg ideiglenes fájlt gyárt ( amit trap-pel illik a végét letakarítani ).
A fenti scriptet átírthatjuk úgy, hogy egyetlen egy parancs legyen:
#!/bin/bash
WIDTH=$(identify -ping -format "%w" $1)
HEIGHT=$(identify -ping -format "%h" $1)
convert $1 \
\( -size ${WIDTH}x${HEIGHT} radial-gradient:black-white \) \
\( -clone 0 -colorspace gray \) \
\( -clone 0 -clone 1 -compose Multiply -composite -normalize \) \
\( -clone 0 -clone 2 -compose Minus -composite \) \
\( -clone 4 -auto-level -modulate 200 +dither -colors 2 -colorspace gray -contrast-stretch 0 \) \
\( -clone 5 -blur 20x20 \) \
\( -clone 5 -negate \) \
\( -clone 7 -blur 20x20 \) \
\( -clone 8 -clone 3 -compose Multiply -composite \) \
\( -clone 6 -clone 0 -compose Multiply -composite \) \
\( -clone 9 -clone 10 -compose Plus -composite \) \
-delete 0-10 \
output.png
A következő módon működik a script:
-
- convert
- Egyetlen egyszer kell convert-et hívni.
-
- $1
- Először is felsorolom az input képeket, ezeket convert megszámozza 0-tól kezdve. Fenti példában egyetlen input kép ($1) van, ez lesz a 0. kép.
-
- ( … )
- Ez egyes alparancsok ( és ) között szerepelnek. Illik új sorba törni őket, hogy legyen egy kis esélyünk megérteni a scriptet.
-
Látszik, hogy nem határozunk meg output fájlt az alparancsoknál. Imagemagick szépen tovább számozza az elkészült fájlokat. A radial-gradient lesz az 1. a gray a 2. …
-
Ha hivatkoznunk kell a korábbi fájlokra, akkor -clone index segítségével tehetjük ezt meg.
-
- -delete 0-10
- A legvégén eldobhatjuk az ideiglenes fájlokat. A fenti script 12 fájlt ( 0. 1. …. 11. ) gyárt, ebből csak az utolsó kell nekünk, égy a 0. indextől a 10. indexig törölhetjük a felesleges fájlokat.
-
- output.png
- A végső eredményt ide írjuk ki.
- Ha töröljük a -delete részt, akkor output-0.png, output-1.png … néven elmenti a script a részeredményeket is, ez elég hasznos, ha debuggolunk.
A script gyorsabb mint az eredeti verzió, mert nem kell png-re konvertálással, fájlba mentéssel, fájlból olvasással, png dekódolással tölteni az időt.
Látszik, hogy az indexekre eléggé oda kell figyelni, ha a script elejét módosítjuk, akkor a későbbi indexeket módosítani kell. Ezen lehet kicsit segíteni, ha kicsit átírjuk a scriptet:
convert $1 \
\( -size ${WIDTH}x${HEIGHT} radial-gradient:black-white \) \
\( -clone 0 -colorspace gray \) \
\( -clone 0 -clone 1 -compose Multiply -composite -normalize \) \
\( -clone 0 -clone 2 -compose Minus -composite \) \
\( +clone -auto-level -modulate 200 +dither -colors 2 -colorspace gray -contrast-stretch 0 \) \
\( +clone -blur 20x20 \) \
\( -clone 5 -negate \) \
\( +clone -blur 20x20 \) \
\( +clone -clone 3 -compose Multiply -composite \) \
\( -clone 6 -clone 0 -compose Multiply -composite \) \
\( -clone 9 +clone -compose Plus -composite \) \
-delete 0--2 \
output.png
-
Az előző lépésben létrejött képre hivatkozhatunk +clone paranccsal.
-
Használhatnám +clone helyett az azzal ekvivalens -clone -1 -et is.
-
Ha a kettővel korábbi képre akarunk hivatkozni, akkor -clone -2 kellene.
-
- delete 0–2
- A -2. index az utolsó előtti képet jelenti.0–2 valójában a 0. indextől a -2. indexig tartó intervallumot jelenti, vagyis ezzel lehet az utolsó kép kivételével az összeset törölni.