Terminal pogryzł człowieka: imgo

Jak skompresować na potrzeby sieci lub archiwizacji dużą liczbę obrazów? Za pomocą rzecz jasna terminal – to oczywiste, w tym cyklu nie pojawi się przecież żadne rozwiązanie które nie wymagałoby tekstowych manipulacji. Jednak tekstowych narzędzi do optymalizacji plików jpeg, png oraz gif powstało tak wiele, że ciężko wymienić je wszystkie jednym tchem. Pngout, pngrewrite, optipng, jpegtran, pngnq, defluff, cryopng, pngcrush. Uf, prawie. A teraz na drugim wdechu wymieniamy parametry, którymi możemy regulować pracę tych narzędzi. Otóż to. Zamiast pamiętać parametry do wszystkich tych programów, wystarczy zaznajomić się z niebanalnym skryptem imgo.

Zadaniem imgo jest uproszczenie naszych relacji z wymienionymi programami i zoptymalizowanie tak kluczowego elementu jak optymalizacja naszych zdjęć. Po co mielibyśmy poprawiać przechowywane na dysku kadry, grafiki i inne? Sama wizja zaoszczędzenia miejsca na nośniku nie już tak kusząca jak jeszcze parę lat temu, przed epoką terabajtowych dysków. Ale jeżeli planujemy przenieść np. na pendrive’ie 1000 zdjęć z wesela. Albo wysłać je w załączniku, wystawić na stronie. Szybko możemy policzyć, że zaoszczędzenie na takich zdjęciach 20 – 30% objętości całości, przyśpieszy kopiowania, wysyłanie, itp. I to jest już warte przemyślenia.

Aby przetestować imgo musi najpierw pobrać ten skrypt ze strony projektu. Sam skrypt wykonany jest w starym, dobrym Bashu i takiej powłoki będziemy potrzebowali, aby go uruchomić. Musimy również nadać mu stosowne uprawnienia:

sudo chmod a+x imgo

Zanim jednak ochoczo przystąpimy do optymalizowania naszych obrazów, kilka faktów. Imgo domyślnie próbuje dokonać kompresji bezstratnej. Im bardziej dołożymy mu opcji, tym mocniej może zaingerować w zawartość pliku. Do swojego działania imgo potrzebuje wspomnianych wcześniej narzędzi. Niestety, nie wszystkie znajdziemy w repozytorium. Te podstawowe to:

sudo apt-get install advancecomp libimage-exiftool-perl imagemagick optipng libjpeg-progs gifsicle pngnq tar unzip libpng-dev git

Kilku jak widać brakuje. Pngout, defluff, pngrewrite, cryopng są rozprowadzane w binarnej postaci i musimy sobie je pobrać samodzielnie, lub użyć skryptu instalacyjnego (dla Debiana/Ubuntu/Minta), który pobierze je i zainstaluje za nas. Skrypt znajdziemy na stronie projektu (na dole). Musimy go zapisać do pliku, nadać plikowi prawa a+x, uruchomić go – skrypt pobierze potrzebne programy, binarki oraz samego imgo. Całość zostanie zainstalowana w /usr/local/bin (o ile uruchomiliśmy skrypt z prawami roota).

Same opcje skryptu są proste i czytelne:

$ ./imgo -h
imgo 0.8: Images Optimizer
Git repo: https://github.com/imgo/imgo
Usage: imgo [-params] [FILE]
Options:
      -h   | --help          displays help
      -b   | --brute         brute mode, best compression, incompatible in IE6
      -png                   optimize only PNG files
      -jpg                   optimize only JPEG files
      -gif                   optimize only GIF files
      -ico                   optimize only ICO files
      -a                     abbreviated information
      -e   | --emulate       emulation mode - files are not overwritten
      -m   | --multipass     multipass - image is processed several times
      -q   | --quiet         hides the whole bar, be quiet
      -V   | --version       displays version number
      -d   | --diff          displays diff info
      -s   | --separate      PNG divided into 2 files - the first with transparency, the second without
      -bkgd                  set bKGD chunk -bkgd#ff0000, only 6 digits format
      -rt                    Remove Transparency
      -nr                    Disable recursive search in subdirectories
      -png8a                 convert PNG24+Alpha to PNG8+palette transparency
      -v   | --log           display log
      --                     end of options: only file names follow
----------
Examples:
      imgo somefile.png
      imgo somedir
      imgo -ie6 somefile.png
      imgo .

Czyli udajemy się do katalogu z naszymi zdjęciami i wywołujemy co najmniej polecenie „imgo .”. Program rekursywnie przeszuka obecną lokalizację w poszukiwaniu plików png, jpeg, gif, ico i spróbuje je zoptymalizować. Za pomocą opcji -png / -jpg / -gif / -ico możemy doprecyzować który format ma być przetwarzany. Opcja -b zapewni nam najlepsze wyniki, ale odbije się to na jakości plików (mocna kompresja stratna). Z kolei -e wyświetli tylko informacje o ewentualnych wynikach optymalizacji, -m spróbuje przetworzyć plik kilkukrotnie, -png8a zmieni 24bitową paletę kolorów pliku png na 8bitową (duży zysk na objętości) a z kolei -rt usunie z obrazów kanał alfa (przeźroczystość).

To całkiem sympatyczny skrypt pozwalający zaoszczędzić mnóstwo czasu. Problematyczne są jedynie zewnętrzne binarne narzędzia potrzebne do jego funkcjonowania. Ale na potrzeby skutecznego usprawniania obrazów png warto spróbować.