Image file formats and compression/fr

Formats de fichiers image et compression

Format intermédiaire
Un fichier intermédiaire est un fichier utilisé uniquement pour transférer l'image d'un programme à l'autre pendant le travail sur celle-ci, par exemple de RawTherapee vers Gimp ou Photoshop.

Le fichier intermédiaire idéal est un format sans pertes de données ou métadonnées et qui est rapide en lecture ou écriture. Cela impose fortement à toujours utiliser comme format intermédiaire le TIFF 16-bits non compressé. Point final.

Format final
Certaines choses sont à considérer pour décider du format à utiliser pour le stockage de fichiers non-intermediares, par exemple, des images dont le traitement est terminé, du film scanné, des images à grande gamme dynamique, etc. :
 * JPEG est le plus largement supporté mais cause des pertes de données et est limité à 8 bits par canal, 24 bits par pixel, dans la majorité des implémentations.
 * TIFF et JPEG supportent les métadonnées, pas PNG, en général.
 * TIFF peut utiliser plusieurs méthodes de compression (y compris celle utilisée par PNG : DEFLATE, aussi appelée Zip). Zip est la méthode de compression la plus efficace pour les photos du monde réel supportées par TIFF.
 * PNG est lent et inefficace.
 * Les images peuvent être extérieurement converties en d'autres format plus efficaces, tels que JPEG-2000 ou OpenEXR en 16-bits.

Comparaison de compressions sans pertes
Le fichier d'entrée est un panorama du monde réel de 10000x5000 pixels en 16 bits.

Pour convertir les formats j'ai utilisé ImageMagick-6.8.8.10 sur un PC x86_64 Intel(R) Core(TM) i7 CPU Q 820 @ 1.73GHz, et j'ai réalisé un script des étapes dans Bash.

TIFF 16-bit
for c in RLE None LZW Zip; do time convert foo.tif[0] -monitor -depth 16 -compress "$c" "${c}_16.tif"; ls -lh "${c}_16.tif"; done

Effectivement, la taille obtenue par RLE est supérieure à celle de l'image non compressée.

TIFF 12-bit
for c in None LZW Zip; do time convert foo.tif[0] -monitor -depth 12 -compress "$c" "${c}_12.tif"; ls -lh "${c}_12.tif"; done

TIFF 8-bit
for c in None LZW Zip; do time convert foo.tif[0] -monitor -depth 8 -compress "$c" "${c}_8.tif"; ls -lh "${c}_8.tif"; done

TIFF 16-bit virgule flottante
for c in None LZW Zip; do time convert foo.tif[0] -monitor -define quantum:format=floating-point -compress "$c" "${c}_fp.tif"; ls -lh "${c}_fp.tif"; done

TIFF 64-bit double-précision virgule flottante
for c in None LZW Zip; do time convert foo.tif[0] -monitor -depth 64 -define quantum:format=floating-point -compress "$c" "${c}_64fp.tif"; ls -lh "${c}_64fp.tif"; done

OpenEXR 16-bit virgule flottante
OpenEXR est un bon choix; il est moderne, efficace et largement supporté. for c in None Zip PIZ; do time convert foo.tif[0] -monitor -depth 16 -compress "$c" "${c}_16.exr"; ls -lh "${c}_16.exr"; done

Pour convertir le format EXR vers le TIFF 16-bits, vous devez choisir l'espace colorimétrique sRGB (le paramétrer, ne pas le transformer): convert Zip_16.exr -depth 16 -set colorspace sRGB suchwow.tif

PNG 16-bit
En fait, PNG. ImageMagick vous laisse paramétrer le niveau de compression zlib de 1 à 9, ou utilise la compression Huffman si vous paramétrez la première valeur à 0. La seconde valeur définit le filtre d'encodage où 5=Adaptive, le meilleur pour les photos dans le monde réel.

for l in 0 6 9; do time foo.tif[0] -monitor -depth 16 -quality "${l}5" "${l}5_16.png"; ls -lh "${l}5_16.png"; done

Remarquez la même taille de fichier pour les niveaux 6 et 9 malgré un temps 4 fois plus long.

PNG 8-bit
for l in 0 6 9; do time foo.tif[0] -monitor -depth 8 -quality "${l}5" "${l}5_8.png"; ls -lh "${l}5_8.png"; done