Quand vous devez envoyer une image ou un son en document informatique, il y a deux manières de faire : avec ou sans pertes. Si vous voulez aller vite et que les détails importent peu, vous utilisez un format lossy, avec pertes. Si votre document ne doit subir aucune altération, vous travaillez en lossless, mais alors sa transmission peu prendre un temps monstrueux et le stockage peut devenir économiquement non justifié.

Prenez un tas de feuilles (1201-jpegmini-papier.jpgimage CC-BY-SA-NC de Benjamin “Hensever” Chan) et décrivez-le en mots. Si vous prenez un texte en lossy, vous diriez :

Plusieurs centaines de rectangles blancs d'environ 20 par 30 cm, empilés verticalement

Si vous êtes intelligent, vous pourriez le faire en lossless en disant :

Une ramette de 500 feuilles blanches vierges au format A4 d'un grammage de 80 g/m², tassée verticalement.

Oui, bon, vous en avez l'idée : ne pas dire 500 fois « une page A4 blanche vierge empilée sur la précédente ».

La plupart du temps, les photographies sont des documents avec une énorme finesse de résolution et tellement de détails, dont un certain nombre superflus (tous les bruits et poussières du capteur de votre APN), qu'on peut raisonnablement travailler en la compression avec pertes. Le format de référence est alors le JPEG.

Le JPEG désigne en terme courant (car en fait, il désigne un groupe technique) un format d'image en compression lossy. On estime acceptable une perte de fidélité dans l'image de part la manière ont l'œil et le cerveau interprètent ce qu'ils voient tous les jours. La méthode de calcul choisie est une compression en vaguelettes. C'est à dire qu'on divise grossièrement l'images en carrés, et qu'on voit si en faisant onduler la luminosité, on peut décrire cet élément macrobloc par une interférence d'ondes.

Nan ! Ne fuyez pas de suite, allez voir cet excellent article de la Wikipédia Anglophone qui explique parfaitement en animation comment les images sont comprimées en JPEG. Ne vous arrêtez pas aux formules mathématiques, descendez à cette animation, vous comprendrez (dessins, discours, tout ça…) et vous aurez retrouvé le “A” que tout le monde cherche depuis 15 jours…

Quand vous sauvez une image en JPEG, le logiciel de traitement vous demande en général quel taux (entre 1 et 12 vaguelettes ou entre 25 et 95 %) de qualité vous souhaitez appliquer. En gros : Meilleure est la qualité, plus gros sera le document.

Le mythique flipper du Bikini, respectivement ré-enregistré
en qualité 25 % (42 ko), 50 % (66 ko), 75 % (99 ko) et 93 % (202 ko)

Les artefacts sont flagrants dans le bandeau rouge et le mur derrière la vitre
© Xavier Mouton-Dubosc, image prise en Octobre 2011 avec l'aimable autorisation du patron des lieux, y'a un piège dans ce comparatif : les images sont classées de droite à gauche

Here comes jpegmini

Depuis trois jours, certains de mes correspondants s'excitent sur une startup, jpegmini, qui promet des documents .jpg entre 5 à 7 fois plus légers.

Capture d'une de leurs démos (enregistrée en .png lossless pour pas tricher)
1201-jpegmini-demo.png
Le fond flou demande techniquement moins de précision que les feuilles en avant-plan

Comment font-ils ? Très facile : Ils ont relu la norme JPEG, ils ont vu comment elle était appliquée au décodage, et il ont vu qu'ils pouvaient très facilement mieux faire à l'encodage. Si si !

Leur astuce est simple : On applique un nombre variable de vaguelettes au carré élémentaire, au lieu d'appliquer un nombre fixé sur l'ensemble du document à chaque carré.

Cela s'appelle varier le débit d'information en fonction de la complexité à encoder.

De l'info inutile

Lors du ré-équipement du studio de la radio où j'officie, nous avions eu la joie d'accueillir un enregistreur numérique Marantz, qui enregistre d'abord sur carte Compact Flash puis envoie le contenu via réseau sur l'intranet de la station.

1201-jpegmini-marantz.jpg
Message de service à celui qui a condamné la trappe à CF : andouille.

Cet appareil à destination des professionnels propose deux format d'enregistrement : le lossless .wav et le lossy .mp3 . Pour des raisons de rapidité de transfert entre machines (et notamment parce qu'un transfert entre l'enregistreur et le réseau ne peut avoir lieu pendant une autre opération sur le Marantz, au hasard, un autre enregistrement, oui je sais, c'est ballot…), Il a été décidé en Haut Lieu d'enregistrer en format .mp3 .
Hélas, Marantz utilise un encodeur hardware utilisant l'algo Fraunhofer, le même institut que j'avais parfois raillé vu les bizarreries “audiophiles”. Ce qui veut dire que si le signal sonore à enregistrer n'a pas besoin des 320 kbits/sec, ben l'engin va générer des informations d'encodage techniquement inutiles.

À la décompression, ces informations sont interprétées, et cela donne des artefacts. En usage normal, ces artefacts ne sont pas audibles. Sauf si vous retravaillez le sonore en question (remontage), puis que vous le sauvez à nouveau en lossy, que vous le rejouez et donc qu'il passe dans la table de mixage de la radio, puis qu'il est ré-encodé pour diffusion/archivage avec du traitement de son analogique. Et là, les artefacts peuvent devenir audibles.

Si on reprend ma ramette de 500 feuilles, imaginez qu'une poussière se soit posée sur la page 23, le temps qu'elle soit interprétée par le compresseur. Celui-ci, qui a été mis en “qualité maximale” va très exactement décrire l'incident :

La 23ème feuille de format d'environ 20,999 par 29,699 cm en partant du haut comporte aux coordonnées X par Y d'abord du blanc, qui est très blanc au milieu, puis un petit peu moins à 2 mm d'une virgule de gris très clair qui (etc…)

Bref, vous l'avez compris, il va en faire une montagne complètement inutile juste histoire de s'occuper et faire croire qu'il a absolument besoin de remplir complètement le débit prévu. Tout simplement parce qu'en débit constant (CBR), le réglage de débit utilise la même valeur à la fois maximale et minimale.
Or, à la décompression, le tas régénéré va comporter des défauts inutiles, inexistants sur l'original, qui ré-apparaîtront et seront exagérés à chaque étape suivante du traitement.

C'est pour ça qu'il est franchement déconseillé de travailler en débit/qualité de compression fixe sur l'ensemble d'un document. Le mieux étant de donner un débit maximal, ou de laisser l'encodeur optimiser son propre taf autour d'une valeur moyenne (on qualifie alors la méthode de VBR, débit variable). À condition que son algorithme ne date pas de 1992.
Et si vous sauvez un document qui doit être ré-utilisé après pour un rendu professionnel, préférez toujours un format lossless (en photo, “raw”)

Rester compatible avec tout le monde, travailler en amont

Image via Gawker, D.R. Supposons que vous soyez un fabriquant de très grosses imprimantes, et que par commodité et économie, vous n'avez qu'un seul modèle de cartons d'expéditions. Vous aurez l'air ridicule à expédier le cable de remplacement dans vos cartons habituels. Ça serait encore plus ridicule si ça vous arrive très souvent car sur la durée, cette économie est vite évaporée par les faits.

Je m'étonne que dans le domaine de l'image où le .jpg n'avait pratiquement aucune concurrence en lossy, personne n'y ai songé plus tôt : Adapter la qualité de rendu selon la complexité de l'image.
Et puisqu'on a un parc déjà fortement déployé de décodeurs de cette norme, de mieux réfléchir en bricolant cette norme.

Comme ce mode de raisonnement en compression variable a été recommandé en ogg vorbis, elle a été appliquée en retour aux .mp3, dans le cadre de l'encodeur LAME. Il faut avouer que depuis, les encodeurs .mp3 sortent des documents largement plus écoutables qu'avant.

En retour, l'adaptation de nouveaux encodeurs a été faite pour le ogg vorbis, permettant là encore de produire des documents de meilleurs qualités, mais restant compatible avec les lecteurs déjà existants (pour les curieux, y'a eu les algos aoTuV, Lancer et Megamix). Le même type de travail d'optimisation était arrivé au Ogg Théora.

Le même travail a été fait en norme vidéo MPEG-2, d'abord dans le cadre de la diffusion satellitaire. L'opérateur TPS l'employait ce qui lui permettait de caler une chaîne de plus en moyenne par multiplexe que Canalsat. Un gain de coût d'exploitation. Cette méthode fut immédiatement adoptée en diffusion terrestre ; les chaînes de la TNT dispose d'une bande passante moyenne, et d'un volume maximal, mais qu'évidemment elle ne peuvent toutes mobiliser en même temps. C'est le travail d'un multi-encodeur que de gérer et balancer les bandes passantes occupées par chacune.

Une descente de ski et un film d'action occupent plus de bande passante à un instant donné, mais pas durant toute leur durée, idem pour un concert d'orchestre philharmonique ou un débat économique sur une chaîne sénatoriale.

Utilité de jpegmini par la pratique

En écartant le PNG qui a une vocation d'être lossless et de permettre la transparence, il existe des algos qui ont pour vocation de succéder au JPEG, notamment le JPEG 2000. On ne rigole pas dans le fond, c'est très sérieux. Sauf qu'il s'agit d'un format qui est payant, non seulement pour générer des documents mais aussi pour les logiciels et matériels qui le lisent. Résultat, il est très peu disponible, par rapport au JPEG classique qui marche dans n'importe quel logiciel, téléphone, set-top box, baladeur, etc…
C'est une des raisons de guéguerre entre le MPEG et WebM. Sauf que ces licences à la lecture ont fait que JPEG 2000 a pris un retard de déploiement considérable.

Donc si on veut avoir des images dans une compression plus efficace, le logiciel JpegMini est la meilleure solution pragmatique.
À priori, en ces temps d'abondance, ce nouvel algo est-il utile ?

Eh ben, dans le web, énormément : Le JPEG est utilisé principalement pour les grandes images. Or, ça m'est arrivé plus d'une fois, j'ai vu des sites qui demandaient d'intégrer des images excessivement grandes (fond de page, parfois changées aléatoirement). Or, qu'une image de fond soit renvoyé/affiché beaucoup plus vite, et le site semblera plus véloce.

D'un autre côté, pour un site à très fort trafic, réduire le volume des images est un gain important à la fois en bande-passante, mais aussi en location de liaison internet. Durant leurs premières années, Google a économisé un argent fou quand il louait son réseau en optimisant sa page de garde autant qu'il a pu. Le design minimaliste a vraiment payé.
C'est toujours le cas pour les sites à très fort trafic qui sont prêts à payer assez cher pour avoir des pages à chargement quasi-instantané, et ceci sans forcément arborer un design épuré. Songez au moindre site d'e-commerce pendant les soldes.

1201-jpegmini-money.jpg
Image CC-BY-SA 401K. Et n'oubliez pas, « money should always be lossless »

Imaginez que vous ayez à gérer un service de photos grand-public, avec plusieurs millions de documents à stocker, dans différentes dimensions. Maintenant, imaginer que cela se chiffre en centaines de serveurs, avec la surface occupée en locaux propres, la maintenance, leurs climatiseurs, le coût direct et induit en électricité et bien sûr la bande-passante.
Combien des services comme Flickr, Fotolia, Google Picasa ou Facebook seraient prêts à débourser pour les optimisations de JpegMini ?

Donc oui, JpegMini est très intéressant, et je serais pas surpris que de telles méthodes d'optimisations soient encore très en vogue pendant au moins 10 ans. J'y crois, parce que c'est réaliste par rapport à des fumisteries comme i2bp et surtout, testable.

Post-Encodum

Ce qui est amusant, c'est que ces optimisations ont lieu quinze ans après qu'on en aie eu cruellement besoin.

Au final, ce qui me frustre, c'est que les bibliothèques open-source (capable de miracles dans d'autres formats comme le .png) ne l'ont pas encore fait en JPEG…