Fotografie z dovolené, jsou jich stovky a zabírají hromady místa. Nedávno jsem potřeboval na svůj web zazálohovat velké množství fotek z mobilu. Mohlo jich být tak 5000. A protože jsem to chtěl uložit do galerie, chtěl jsem, aby byly všechny určitého formátu, rozměrů a malé velikosti.
Pojďme se podívat, jak dávkově zpracovat tak velké množství obrázků. Ručně převádět takové množství obrázků by se nikomu opravdu nechtělo. Ať už bych to dělal v GIMPu či podobném grafickém programu, zabralo by to zřejmě hromadu času.
Na Linuxu je naštěstí k dispozici sada terminálových nástrojů pro práci s bitmapovými obrázky ImageMagick. Jsou to malé skripty, které můžeme dobře využít přímo příkazovém řádku i použít je ve skriptu.
Nejprve si tedy nainstalujeme ImageMagick.
Ubuntu:
sudo apt-get install imagemagick
Fedora:
sudo dnf install ImageMagick
A nyní se již můžeme pustit do úprav.
Řekněme že máme obrázky ve formátu JPG a chceme je mít v PNG. Použijeme příkaz convert:
convert obazek.jpg obrazek.png
Pokud potřebujeme změnit velikost obrázku, použijeme opět příkaz convert. Následující příklad změní původní výšku obrázku na novou o hodnotě 300px, přičemž zachová poměr stran (šířku změní ve stejném poměru):
convert obrazek.png -resize 300 obrazek-zmenseny.png
Pokud máme předem požadovanou šířku a výšku chceme změnit poměrově, příkaz bude vypadat následovně:
convert obrazek.png -resize x150 obrazek-zmenseny.png
Někdy se hodí zadat přesné rozměry bez ohledu na to, zda bude dodržen poměr stran:
convert obrazek.png -resize 300x150! obrazek-zmenseny.png
No a pokud chcete zachovat poměr stran, ale máte požadavek, aby se obrázek "vešel" do určité velikosti, není nic jednodužšího:
convert obrazek.png -resize 300x150 obrazek-zmenseny.png
convert obrazek.png -quality 85 obrazek-zmenseny.jpg
Obrázky můžeme otáčet, např. pokud jsme je vyfotili naležato a chceme je o 90° překlopit:
convert obrazek.png -rotate 90 obrazek-otoceny.png
Co jsem nezmínil výše je, že jednotlivé operace můžeme v jednom kroku kombinovat. Můžeme tak například obrázek zmenšit a zároveň otočit. Také můžeme použít pro vstup i výstup stejné jméno souboru - pak se nám starý logicky přepíše novým, změněným. Ale teď už pojďme na nejzajímavější část, jak si to celé napsat dohromady.
Řekněme, že máme v adresáři množství obrázků ve formátu JPG různé velikosti. Naším cílem je, abychom měli všechny obrázky o výšce 400px, chceme zachovat poměr stran (tzn. nebudeme je deformovat) a kvůli velikosti ještě snížíme kvalitu. Příkaz, který to celé provede za nás, může vypadat zhruba takto:
for soubor in *.jpg; do convert $soubor -quality 85 -resize 400 $soubor; done
Tak a teď si můžete dát kafe. Konverze 5000 obrázků přece jen zabere nějaký ten čas.
Pokud jste přece jen kafe již vypili, příště to můžete zkusit ještě trochu urychlit. Např. spuštěním konverze ve více vláknech najednou.
Nainstalujte si program parallel.
Fedora:
sudo dnf install parallel
Ubuntu:
sudo apt-get install parallel
A spusťe ve více vláknech (doplňte požadované parametry konverze):
ls -1 *.jpg | parallel -j 3 convert '{}' '{.}.jpg'
Zdroje:
Convert, Edit, Or Compose Bitmap Images @ ImageMagick
ImageMagick - Community Help Wiki
Batch converting PNG to JPG in linux - Super User