pátek 24. května 2013

Moudro dne

Bohatství je pro moudrého sluhou, pro hlupáka pánem.

Lucius Annaeus Seneca

pondělí 13. května 2013

Tvorba CD s fotkami z akce

Potřeboval jsem tuhle nedávno vytvořit CDčko s fotkama. Vzhledem k tomu, že počet fotek na CD byl od začátku odhadován na cca 500, napsal jsem si dva skripty v BASHi, které mi měly práci usnadnit.

První z nich vytáhne z aktuálního adresáře (podadresáře ne) všechny soubory s příponou .JPG (leze snad ze všech foťáků, nesetkal jsem se s protipříkladem). Tyto fotky seřadí podle data vzniku od nejstaršího po nejmladší. V tomto pořadí pro každou fotku vyrobí dva soubory, xxxxv.jpg a xxxxm.jpg. Zde xxxx je pořadové číslo zleva doplněné o nuly, číslováno od nuly (takže nejstarší fotka bude mít 0000v.jpg a 0000m.jpg). Soubor s písmenem 'm' v názvu je náhled fotky o velikosti 19200 pixelů (při poměru stran 4:3 to vychází na 160x120). Soubor s písmenem 'v' v názvu je fotka samotná, akorát zmenšená na 3,84 MPx (původně bylo 1,92MPx, tedy 1600x1200 při poměru stran 4:3, dvojnásobek použit z důvodu dostatečné kapacity na CDčku). U obou nově vzniklých souborů je nastaveno datum shodně s datumem původního souboru.

Všechny fotky byly takto převedeny na 3.84 MPx, aby to bylo shodné i při použití fotek z různých foťáků. Problém nastává ve dvou případech. Jednak u foťáků, které nemají nastavený poměr stran 4:3. Pak fotka bude mít jiné rozměry. Druhý problém nastává u obstarožních foťáků, které mají menší rozlišení. Já jsem nakonec takové fotky na CDčko neumístil, i když se ke mně dostaly.

A zde ten skript:

#!/bin/bash

fotky=`ls -t -r | grep "\.JPG$" | sed "s/\.JPG//g"`
i=0

for f in $fotky
do
 nazev=`printf "%04d" $i`

 printf "Converting %s.JPG to %s.jpg\n" ${f} ${nazev}

 convert ${f}".JPG" -resize 3840000@ ${nazev}"v.jpg"
 touch -r ${f}".JPG" ${nazev}"v.jpg"

 convert ${f}".JPG" -resize 19200@ ${nazev}"m.jpg"
 touch -r ${f}".JPG" ${nazev}"m.jpg"

 let i=i+1
done

Následně jsem vytvořil html stránku s tabulkou tvořenou náhledy (tedy soubory s 'm' v názvu). Po kliknutí na náhled se otevřel javascriptový prohlížeč, kde šlo klikat na levý a pravý okraj a tím jsem se posouval po jednotlivých fotkách. K tomuto jsem použil lightzap, framework založený na lightboxu. Oproti lightboxu navíc dělá to, že fotku před zobrazením zmenší tak, aby se celá vešla na monitor. Nevýhodou je fakt, že pro procházení nelze použít šipky na klávesnici.

Skript generující tabulku vypadá takto:

#!/bin/bash

fotky=`ls | grep "m\.jpg"`

echo "<table>"
echo -n "<tr>"
hranice=4
poz=0

adresar=`basename $PWD`

for f in $fotky
do
 f2=`echo $f | sed "s/m\.jpg//"`
 if [ $poz -eq $hranice ]; then
  poz=0
  echo -n -e "</tr>\n<tr>"
 fi
 echo -n "<td><a href=\"${adresar}/${f2}v.jpg\" data-lightzap=\"fotky\" title=\"\"><img alt=\"\" src=\"${adresar}/${f2}m.jpg\"></a></td>"
 let poz=poz+1
done
echo -e "</tr>\n</table>"

Tento skript na svůj standartní výstup vypíše html tabulku. Tuto tabulku stačí jednoduše vložit do html dokumentu v nadřazeném adresáři, do kterého bude vloženo css/lightzap.css a js/lightzap.js ze staženého archivu z odkazu výše.

Shrnutí postupu. Potřeba je linux, bash, lightzap (odkaz viz výše) a prográmek convert (v debianu a v ubuntu je v repozitářích). Vytvořit adresář, kde bude obsah budoucího CD/DVD. Do něj nakopírovat adresáře css, js a icons z lightzap. Vytvořit adresář pro každou kategorii fotek, do něj nakopírovat požadované fotky, spustit první skript, spustit druhý skript a zachovat si jeho výstup (třeba přesměrovat do souboru). Tento výstup vložit do html souboru umístěného přímo v adresáři pro CD/DVD. Pokud s nějakou fotkou nejsme spokojeni, upravit a znovu spustit skripty. Na závěr vymazat všechny pomocné soubory a původní fotky (ty se ve skriptu nemažou, aby šlo postup velmi snadno opakovat s úpravou některých fotek).

V prvním skriptu se vyskytují jako parametr convert věci jako 19200@ nebo 3840000@. To znamená, kolik pixelů má mít náhled, resp. fotka. Není problém změnit a spustit znovu. Ve druhém skriptu se vyskytuje hranice=4. To znamená, že v html tabulce budou 4 fotky na řádku. Pokusy s tímto číslem mohou taktéž přinést zajímavé výsledky.