Jak hromadně převést obrázky na jinou velikost či formát

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.

Instalace

Nejprve si tedy nainstalujeme ImageMagick.

Ubuntu:

sudo apt-get install imagemagick

Fedora:

sudo dnf install ImageMagick

Základní operace

A nyní se již můžeme pustit do úprav.

Změna formátu

Ř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

Snížení kvality (a s tím spojené snížení velikosti souboru s obrázkem)

convert obrazek.png -quality 85 obrazek-zmenseny.jpg

Otáčení

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

Dávkové zpracování

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.

Tip na závěr

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

vesp

0 Comments: