Skript pro hromadné úpravy obrázků
Všichni jistě umíme skriptovat v shellu… Já ne :-) Takže když jsem nedávno potřebovala hromadně upravovat obrázky, naučila jsem se u toho, jak skvěle se dají psát skripty v Elixiru.
Využila jsem elixirovou funkci System.cmd, pomocí které spustím příkaz, jako bych ho spouštěla na příkazové řádce, a ImageMagick.
Níže je skript, který k *-large.jpg
obrázkům v daném adresáři vytvoří 100px
-small
verzi. Nejprve načte názvy vstupních souborů, vytvoří názvy
výstupních souborů, a pak provede příkaz convert
.
Tip: parametr -strip
smaže případná metadata, čímž se obrázek podstatně
zmenší.
"./*-large.jpg"
|> Path.wildcard()
|> Enum.map(& {&1, String.replace(&1, "-large.jpg", "-small.jpg")})
|> Enum.map(fn {input_file, output_file} ->
System.cmd("convert", [input_file, "-resize", "100x", "-strip", "-quality", "92", output_file])
end)
Skript uložím do souboru s příponou .exs
a pomocí příkazu elixir
pak spustím:
$ elixir image-resize.exs
A další šikovný skript přejmenuje obrázky v podadresářích podle názvů příslušných adresářů. (Je to jen skriptík, takže pozor, pokud by se v adresáři už vyskytoval soubor se stejným názvem, bude přepsán.)
"."
|> File.ls!()
|> Enum.filter(&File.dir?/1)
|> Enum.map(fn folder ->
"./#{folder}/*.jpg"
|> Path.wildcard()
|> Enum.with_index(1)
|> Enum.map(fn {filename, index} ->
File.rename(
filename,
"./#{folder}/#{folder}#{String.pad_leading(to_string(index), 3, "0")}.jpg"
)
end)
end)
├── ovoce ├── ovoce
│ └── 20190712.jpg │ └── ovoce001.jpg
│ └── pic108.jpg │ └── ovoce002.jpg
├── zahrada ├── zahrada
│ └── DSC87394.jpg │ └── zahrada001.jpg
│ └── IMG20200507.jpg │ └── zahrada002.jpg
│ └── photo20.jpg │ └── zahrada003.jpg