#howto - Conversione ed ottimizzazione immagini: JPEG
Ottimizzare è un procedimento che consiste principalmente nella riduzione dello spazio cromatico (il totale dei diversi colori presenti in un’immagine) e, quando possibile, nella variazione dell’algoritmo di compressione con uno più efficiente: il tutto, al fine di diminuire il tempo di decodifica e il peso finale del file senza che la qualità ne sia eccessivamente compromessa.
In questo articolo vedremo come ottimizzare le dimensioni di immagini in alcuni formati.
JPEG
JPEG
è il formato immagine più utilizzato di sempre: è un primato che detiene ancora oggi, a distanza di poco più di 30 anni dalla sua creazione (risalente al 1992).
A contribuire alla sua diffusione è stata la particolarità di essere un formato lossy (un tipo di compressione che rimuove definitivamente alcuni - solitamente impercettibili - dettagli, dopo ogni modifica o salvataggio): è uno dei fattori che consente alle immagini in questo formato di occupare poco spazio.
Funziona bene per immagini molto complesse, ma a non è adatto a ricoprire tutte le casistiche: tra i principali difetti c’è infatti quello di non supportare la trasparenza e le animazioni.
jpegoptim
Uno degli strumenti più usati, consente di ottimizzare le immagini in modo diverso, sia ricorrendo a procedure lossy che lossless.
# Ottimizzazione lossless
jpegoptim --strip-all --stdout input.jpg > output.jpg
# Conversione lossy - ricompressione a qualità 75
jpegoptim --max=75 --all-progressive --strip-all --stdout input.jpg > output.jpg
# Conversione lossy - target di 64KB
jpegoptim --size=64 --all-progressive --strip-all --stdout input.jpg > output.jpg
# Conversione lossy - target di -10%
jpegoptim --size=90% --all-progressive --strip-all --stdout input.jpg > output.jpg
# Nota bene: è solitamente una cattiva idea convertire immagini da un formato lossy ad uno lossy.
# (come JPEG -> JPEG, a meno che il procedimento non sia sicuramente lossless).
Ubuntu
apt-get install jpegoptim
Fedora
dnf install jpegoptim
Arch Linux
pacman -S jpegoptim
jpegtran
È un tool che principalmente permette di applicare delle trasformazioni lossless (senza perdità di qualità: rotazione, capovolgimento orizzontale, capovolgimento verticale, e in alcuni casi anche di ritaglio e cancellazione).
Il parametro -optimize
consente di ottimizzare le tabelle di Huffman, riducendo perciò la dimensione del file.
Il parametro -copy
impostato a none
permette di ridurre ulteriormente le dimensioni tralasciando eventuali commenti e altri metadati.
jpegtran -optimize -copy none input.jpg > output.jpg
Ubuntu
apt-get install jpegtran
Fedora
dnf install jpegtran
Arch Linux
pacman -S jpegtran
cjpeg
Fa parte della libreria libjpeg-turbo, ampiamente utilizzata in numerosi software.
Il parametro -optimize allunga i tempi facendo solo diminuire il peso del file
Il parametro -quality accetta valori interi fino a 100 (l’ottimale è 50-95; di default è 75)
cjpeg -optimize -quality 80 -outfile output.jpg input.jpg
Ubuntu
apt-get install libjpeg-turbo-progs
Fedora
dnf install libjpeg-turbo-utils
Arch Linux
pacman -S libjpeg-turbo
mozjpeg
Si tratta di un fork della libreria libjpeg-turbo, creato da Mozilla, in cui le differenze dal progetto originario mirano ad essere “minimali”.
Le principale feature sono il supporto a un diverso tipo di quantizzazione (una delle fasi di compressione che “prepara” i dati per poter essere maggiormente compressi; permette di ridurre un intervallo di numeri più grande in un intervallo più piccolo)
Ufficialmente è sconsigliato l’utilizzo dell’interfaccia CLI (da terminale) in quanto l’interfaccia primaria è quella programmatica.
Compilazione
I sorgenti disponibili su GitHub vanno compilati:
# Per Ubuntu
apt install autoconf automake libtool nasm make pkg-config git
# Per Fedora
pacman -S autoconf automake libtool nasm make pkgconf-pkg-config git
# Per Arch Linux
pacman -S autoconf automake libtool nasm make pkgconf-pkg-config git
# Il resto dei passaggi in comune:
git clone https://github.com/mozilla/mozjpeg.git
cd mozjpeg
./configure
make
make install
guetzli
È un tool sviluppato da Google che utilizza un diverso approccio per la compressione: si basa su un algoritmo più complesso che individua la migliore combinazione di parametri in base all’immagine.
Nonostante la fase compressione sia più lenta e richieda molte più risorse (specie RAM, ma anche di tempo) rispetto ad altri strumenti simili, ciò consente una migliore ottimizzazione e una maggiore fedeltà qualitativa (grazie alle “ottimizzazioni psicovisive”, le immagini appaiono infatti migliori alla percezione umana).
guetzli --quality quality_value input.jpg output.jpg
Ubuntu
apt-get install guetzli
Fedora
dnf install guetzli
Arch Linux
pacman -S guetzli
ImageMagick
ImageMagick è un tool generico che permette di mostrare, generare, convertire (anche da un formato all’altro) e modificare immagini raster e vettoriali.
Anche ImageMagick può essere utilizzato per ottimizzare immagini (non solamente immagini JPEG).
# Parametri ampiamente usati per la compressione di un'immagine (lossless -> lossy):
# -interlace Plane (in questo caso indica di generare un'immagine JPEG progressiva)
# -define jpeg:dct-method=float (permette una migliore ottimizzazione impiegando però più tempo)
# -sampling-factor 4:2:0 (tipico delle immagini lossy, viene data maggiore rilevanza alla scala di grigi e meno alla componente cromatica)
# -quality 85% (imposta la qualità a un livello molto alto)
# -strip (rimuove eventuali commenti ed altri metadati)
convert input.png -interlace Plane -define jpeg:dct-method=float -sampling-factor 4:2:0 -quality 85% -strip output.jpg
Ubuntu
apt-get install imagemagick
Fedora
dnf install imagemagick6
Arch Linux
pacman -S imagemagick6
Per ulteriori informazioni, è possibile consultare la documentazione ufficiale.