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 (image 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)
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.
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
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.
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…
4 réactions
1 De Mitch 74 - 25/01/2012, 10:28
Faut rappeler que LAME est, à la base, un simple patch démontrant une faille dans la norme: la gestion du bit reservoir fait qu'il est facile d'obtenir un bitrate variable avec un décodeur implémentant la norme, alors que le format définit un bitrate fixe. Qu'il soit devenu un encodeur complet avec des améliorations dans tous les sens, c'est parce qu'il prédate (et de loin) toute autre alternative viable; le vorbis a d'ailleurs été développé parce qu'il y a des problèmes inhérents au format empêchant une parfaite reproduction du son quel que soit le débit utilisé.
Dans le cas du PNG, le format a été développé par nécessité à l'époque où le GIF était devenu payant - et les développeurs ne se sont pas cassé la nénette: c'est l'algorithme deflate (ou LZ77/Huffman, comme le Zip) qui est appliqué sur chaque ligne de pixel (ou sur chaque canal pour un PNG32) - rudimentaire, mais suffisamment efficace pour faire ce que doit: remplacer le GIF.
Ici, la technique décrite ressemble à s'y méprendre à l'adaptative encoding, décrite pour la première fois sur les encodeurs MPEG-4 tels que Xvid, et utilisée de base en h.264: donc probablement brevetée. Le souci d'une technique comme celle-ci, c'est qu'elle produit assez facilement des artéfacts dans les zones sombres, ce qui est difficilement notable dans une animation, mais qui te pète à la figure sur une image fixe...
C'est pourquoi les développeurs de logiciels libres ont préféré travailler sur l'efficacité globale de compresseurs comme libjpeg plutôt que de chercher la petite bête: les artefacts sur le rouge en compression 25%, par exemple, est parce que Photoshop bascule sur une matrice de compression 4:1:1 (1 pixel sur 4 est encodé dans le canal rouge, le faisant "baver" - ceci parce que le rouge étant moins perceptible à l'oeil, le cerveau reconstitue les contrastes de l'image à partir des bleus et verts - la bande rouge ici présente est le pire des cas possibles) lorsque on descend la compression à 50%.
Si tu compresses en 1:1:1 à 25% sous le Gimp, tu constateras des artefacts différents - mais le rouge ne bavera plus.
Une technique qui apporte parfois des gains en compression en JPEG (mais pas toujours!), c'est le progressive encoding: il est possible de gagner 15% sur la taille de l'image en faisant un encodage en 3 passes. Mais sur d'autres images, il y aura une perte de 5%...
Des projets open source qui compressent une douzaine de fois une image pour garder la meilleure existent - mais ils demandent de compresser l'image 12 fois pour fonctionner, et donc ce n'est pas implémenté directement par les bibliothèques: trop lourd.
2 De Gilboy - 10/02/2012, 15:07
Bon article Mouton !
Merci.
3 De Wizmaster - 17/02/2012, 17:22
En arrivant largement après la bataille, grosse précision :
- la compression par vaguelettes (wavelet transform) est le fondement de JPEG 2000 et non JPEG
- JPEG "standard" utilise la DCT (Discrete Cosine Transform), une extension en 2 dimension de la FFT (Fast Fourier Transform) bien connue en analyse de signal
4 De da scritch net works - 13/03/2012, 15:09
Me voici à Sud Web
Et bang ! J'ai encore du mal à y croire. Mais fin Mai, je devrais aussi assurer le show. Me voici orateur à Sud Web, la plus grande conférence technique du secteur au sud de Paris. Un festival de rock stars du web jouant de vertigineux solos de...