From 7134a08dd4d7f83b878a14641c9cf3528e13a44f Mon Sep 17 00:00:00 2001 From: ache Date: Fri, 11 Aug 2023 12:12:14 +0200 Subject: Pubish image format study --- articles/formats-images-web.md | 553 ++++++++++++++++++++ articles/res/avif_support.avif | Bin 0 -> 23484 bytes articles/res/avif_support.png | Bin 0 -> 101654 bytes .../res/iframe_imgs/Encoding time by encoder.html | 1 + .../res/iframe_imgs/Encoding time by encoder.png | Bin 0 -> 101005 bytes .../General trend for PNG images from XKCD.html | 1 + .../General trend for PNG images from XKCD.png | Bin 0 -> 108743 bytes ...eral trend for photos in the INRIA dataset.html | 1 + ...neral trend for photos in the INRIA dataset.png | Bin 0 -> 100571 bytes ... where JXL and WebP dominate other formats.html | 1 + ...D where JXL and WebP dominate other formats.png | Bin 0 -> 114396 bytes .../res/iframe_imgs/General trend in PNGs.html | 1 + articles/res/iframe_imgs/General trend in PNGs.png | Bin 0 -> 99861 bytes .../General trend in high-resolution photos.html | 1 + .../General trend in high-resolution photos.png | Bin 0 -> 97644 bytes .../General trend in low-resolution photos.html | 1 + .../General trend in low-resolution photos.png | Bin 0 -> 100050 bytes .../General trend in personal photos.html | 1 + .../General trend in personal photos.png | Bin 0 -> 96688 bytes .../iframe_imgs/Mean decoding time by decoder.html | 1 + .../iframe_imgs/Mean decoding time by decoder.png | Bin 0 -> 96938 bytes .../Median decoding time by decoder.html | 1 + .../Median decoding time by decoder.png | Bin 0 -> 98339 bytes .../Notably poor heic-enc performance.html | 1 + .../Notably poor heic-enc performance.png | Bin 0 -> 100324 bytes ...rformances de heic-enc notablement faibles.html | 1 + ...erformances de heic-enc notablement faibles.png | Bin 0 -> 101325 bytes ...R\303\251sultats \303\251parpill\303\251s.html" | 1 + .../R\303\251sultats \303\251parpill\303\251s.png" | Bin 0 -> 105880 bytes articles/res/iframe_imgs/Scattered results.html | 1 + articles/res/iframe_imgs/Scattered results.png | Bin 0 -> 105361 bytes .../iframe_imgs/Temps d'encodage par encodeur.html | 1 + .../iframe_imgs/Temps d'encodage par encodeur.png | Bin 0 -> 104287 bytes ...en de d\303\251codage par d\303\251codeur.html" | 1 + ...yen de d\303\251codage par d\303\251codeur.png" | Bin 0 -> 98808 bytes ...an de d\303\251codage par d\303\251codeur.html" | 1 + ...ian de d\303\251codage par d\303\251codeur.png" | Bin 0 -> 99283 bytes ...1 JXL et WebP dominent les autres formats.html" | 1 + ...71 JXL et WebP dominent les autres formats.png" | Bin 0 -> 114013 bytes .../Tendance g\303\251n\303\251rale des PNG.html" | 1 + .../Tendance g\303\251n\303\251rale des PNG.png" | Bin 0 -> 101348 bytes ...303\251rale des images PNG issues de XKCD.html" | 1 + ...\303\251rale des images PNG issues de XKCD.png" | Bin 0 -> 110072 bytes ... des images de r\303\251solutions faibles.html" | 1 + ...e des images de r\303\251solutions faibles.png" | Bin 0 -> 102354 bytes ...ale des photos de haute r\303\251solution.html" | 1 + ...rale des photos de haute r\303\251solution.png" | Bin 0 -> 99954 bytes ...hotos du jeu de donn\303\251es de l'INRIA.html" | 1 + ...photos du jeu de donn\303\251es de l'INRIA.png" | Bin 0 -> 101644 bytes ...\251n\303\251rale des photos personnelles.html" | 1 + ...3\251n\303\251rale des photos personnelles.png" | Bin 0 -> 99043 bytes .../iframe_imgs/cat_donus_pixel_art_pngwing.html | 1 + .../iframe_imgs/cat_donus_pixel_art_pngwing.png | Bin 0 -> 108978 bytes articles/res/iframe_imgs/eiffel_tower_pngwing.html | 1 + articles/res/iframe_imgs/eiffel_tower_pngwing.png | Bin 0 -> 99957 bytes articles/res/iframe_imgs/screenshot_ache.html | 1 + articles/res/iframe_imgs/screenshot_ache.png | Bin 0 -> 102783 bytes .../screenshot_firefox_c_quirks_fr_ache_one.html | 1 + .../screenshot_firefox_c_quirks_fr_ache_one.png | Bin 0 -> 97407 bytes .../iframe_imgs/screenshot_firefox_wikipedia.html | 1 + .../iframe_imgs/screenshot_firefox_wikipedia.png | Bin 0 -> 109895 bytes articles/res/jxl_support.avif | Bin 0 -> 22788 bytes articles/res/jxl_support.png | Bin 0 -> 93802 bytes articles/res/raw_data_images_format_2023.csv | 170 +++++++ articles/res/support_avif.avif | Bin 0 -> 23606 bytes articles/res/support_avif.png | Bin 0 -> 102483 bytes articles/res/support_jxl.avif | Bin 0 -> 23352 bytes articles/res/support_jxl.png | Bin 0 -> 94738 bytes articles/res/support_webp.avif | Bin 0 -> 24432 bytes articles/res/support_webp.png | Bin 0 -> 96020 bytes articles/res/webp_support.avif | Bin 0 -> 24154 bytes articles/res/webp_support.png | Bin 0 -> 95047 bytes articles/web-image-formats.md | 563 +++++++++++++++++++++ src/build/i18n.mjs | 2 + src/img/ic_note_black_48px.svg | 4 + 75 files changed, 1321 insertions(+) create mode 100644 articles/formats-images-web.md create mode 100644 articles/res/avif_support.avif create mode 100644 articles/res/avif_support.png create mode 100644 articles/res/iframe_imgs/Encoding time by encoder.html create mode 100644 articles/res/iframe_imgs/Encoding time by encoder.png create mode 100644 articles/res/iframe_imgs/General trend for PNG images from XKCD.html create mode 100644 articles/res/iframe_imgs/General trend for PNG images from XKCD.png create mode 100644 articles/res/iframe_imgs/General trend for photos in the INRIA dataset.html create mode 100644 articles/res/iframe_imgs/General trend for photos in the INRIA dataset.png create mode 100644 articles/res/iframe_imgs/General trend in PNG images from XKCD where JXL and WebP dominate other formats.html create mode 100644 articles/res/iframe_imgs/General trend in PNG images from XKCD where JXL and WebP dominate other formats.png create mode 100644 articles/res/iframe_imgs/General trend in PNGs.html create mode 100644 articles/res/iframe_imgs/General trend in PNGs.png create mode 100644 articles/res/iframe_imgs/General trend in high-resolution photos.html create mode 100644 articles/res/iframe_imgs/General trend in high-resolution photos.png create mode 100644 articles/res/iframe_imgs/General trend in low-resolution photos.html create mode 100644 articles/res/iframe_imgs/General trend in low-resolution photos.png create mode 100644 articles/res/iframe_imgs/General trend in personal photos.html create mode 100644 articles/res/iframe_imgs/General trend in personal photos.png create mode 100644 articles/res/iframe_imgs/Mean decoding time by decoder.html create mode 100644 articles/res/iframe_imgs/Mean decoding time by decoder.png create mode 100644 articles/res/iframe_imgs/Median decoding time by decoder.html create mode 100644 articles/res/iframe_imgs/Median decoding time by decoder.png create mode 100644 articles/res/iframe_imgs/Notably poor heic-enc performance.html create mode 100644 articles/res/iframe_imgs/Notably poor heic-enc performance.png create mode 100644 articles/res/iframe_imgs/Performances de heic-enc notablement faibles.html create mode 100644 articles/res/iframe_imgs/Performances de heic-enc notablement faibles.png create mode 100644 "articles/res/iframe_imgs/R\303\251sultats \303\251parpill\303\251s.html" create mode 100644 "articles/res/iframe_imgs/R\303\251sultats \303\251parpill\303\251s.png" create mode 100644 articles/res/iframe_imgs/Scattered results.html create mode 100644 articles/res/iframe_imgs/Scattered results.png create mode 100644 articles/res/iframe_imgs/Temps d'encodage par encodeur.html create mode 100644 articles/res/iframe_imgs/Temps d'encodage par encodeur.png create mode 100644 "articles/res/iframe_imgs/Temps moyen de d\303\251codage par d\303\251codeur.html" create mode 100644 "articles/res/iframe_imgs/Temps moyen de d\303\251codage par d\303\251codeur.png" create mode 100644 "articles/res/iframe_imgs/Temps m\303\251dian de d\303\251codage par d\303\251codeur.html" create mode 100644 "articles/res/iframe_imgs/Temps m\303\251dian de d\303\251codage par d\303\251codeur.png" create mode 100644 "articles/res/iframe_imgs/Tendance des images PNG de XKCD o\303\271 JXL et WebP dominent les autres formats.html" create mode 100644 "articles/res/iframe_imgs/Tendance des images PNG de XKCD o\303\271 JXL et WebP dominent les autres formats.png" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des PNG.html" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des PNG.png" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images PNG issues de XKCD.html" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images PNG issues de XKCD.png" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images de r\303\251solutions faibles.html" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images de r\303\251solutions faibles.png" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos de haute r\303\251solution.html" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos de haute r\303\251solution.png" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos du jeu de donn\303\251es de l'INRIA.html" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos du jeu de donn\303\251es de l'INRIA.png" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos personnelles.html" create mode 100644 "articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos personnelles.png" create mode 100644 articles/res/iframe_imgs/cat_donus_pixel_art_pngwing.html create mode 100644 articles/res/iframe_imgs/cat_donus_pixel_art_pngwing.png create mode 100644 articles/res/iframe_imgs/eiffel_tower_pngwing.html create mode 100644 articles/res/iframe_imgs/eiffel_tower_pngwing.png create mode 100644 articles/res/iframe_imgs/screenshot_ache.html create mode 100644 articles/res/iframe_imgs/screenshot_ache.png create mode 100644 articles/res/iframe_imgs/screenshot_firefox_c_quirks_fr_ache_one.html create mode 100644 articles/res/iframe_imgs/screenshot_firefox_c_quirks_fr_ache_one.png create mode 100644 articles/res/iframe_imgs/screenshot_firefox_wikipedia.html create mode 100644 articles/res/iframe_imgs/screenshot_firefox_wikipedia.png create mode 100644 articles/res/jxl_support.avif create mode 100644 articles/res/jxl_support.png create mode 100644 articles/res/raw_data_images_format_2023.csv create mode 100644 articles/res/support_avif.avif create mode 100644 articles/res/support_avif.png create mode 100644 articles/res/support_jxl.avif create mode 100644 articles/res/support_jxl.png create mode 100644 articles/res/support_webp.avif create mode 100644 articles/res/support_webp.png create mode 100644 articles/res/webp_support.avif create mode 100644 articles/res/webp_support.png create mode 100644 articles/web-image-formats.md create mode 100644 src/img/ic_note_black_48px.svg diff --git a/articles/formats-images-web.md b/articles/formats-images-web.md new file mode 100644 index 0000000..f1f9c82 --- /dev/null +++ b/articles/formats-images-web.md @@ -0,0 +1,553 @@ +--- + +pubDate = 2023-08-11 +tags = ['web', 'image', 'programmation'] + +[author] +name = "ache" +email = "ache@ache.one" + +[[alt_lang]] +lang = "en" +url = "/articles/web-image-formats" + +--- + + + + +Étude des formats d'images +========================== + +![Image SVG d'un ordinateur moderne](/s/imgM/computer.svg) +Quels formats d'images utiliser de nos jours ? +Dans cet article, étudions les formats d'images modernes, (AVIF, HEIF, WebP, WebP2 et JPEG XL) le plus justement possible. 🖼️ + +D'abord, je vais présenter comment j'ai étudié ces formats d'images. +Puis je ferais une comparaison des encodeurs. +Ensuite, j'analyserais les données récoltées de manière la plus complète possible. +Enfin, à partir de l'analyse des données, on comparera les formats d'images et leur cas d'utilisation. + +:::note +Cet article va être long et technique. N'hésitez pas à aller directement à la partie analyse, ou même à la conclusion. +::: + +Sommaire +-------- + +Protocole d'étude +---------------- + +J'ai constitué un jeu d'images *libres de droits* trouvées sur le web. +Ce jeu de donnée est constitué d'images de dimensions, de tailles, d'origines et d'usages très variés. +Au total, ce sont 169 images issues de 6 jeux de données différents qui ont été analysées. + +Chaque encodeur converti les images en faisant variées, pour chaque image, les options de vitesses (parfois appelé effort) et de qualité. +Ainsi pour **chaque image**, 308 images ont été produites. + +Puisque les formats étudiés utilisent tous des compressions à perte, il est nécessaire d'estimer la qualité perdue lors du processus d'encodage. +Chaque image produite a ainsi été décodée vers le format PNG. +Celle-ci a servi à calculer la similarité structurelle afin de pouvoir estimer la perte de qualité induite par l'encodeur. [^DSSIM] + +[^DSSIM]: [L'implémentation (en Rust) utilisée](https://kornel.ski/dssim) est celle de [Kornel](https://mastodon.social/@kornel), que je remercie. + +Pour chaque image les données récoltées de ce processus sont: + + - [x] Si le processus d'encodage a réussi (Code de retour de l'encodeur égal à 0). + - [x] Le nom de l'image et de son jeu de données. + - [x] Le format de l'encodeur ainsi que les paramètres de qualité et d'effort (vitesses de compression) utilisés par l'encodeur. + - [x] La taille de l'image source et de l'image cible afin de calculer le taux de compression. + - [x] Le temps d'encodage et de décodage de l'image cible. + - [x] La mesure de similarité[^dis] structurelle. + - [x] La date à laquelle l'image a été générée. + +[^dis]: Techniquement, un calcul de dissimilarité. Ici, on cherche les similarités dites structurelles entre deux images par l'algorithme [SSIM](https://fr.wikipedia.org/wiki/Structural_Similarity). +C'est une des méthodes d'estimation de la différence de perception entre deux images. + + +#### Résultats attendus + +Je m'attends à ce que WebP soit moins performant que les autres formats sur tous les points. +Aussi, AVIF devrait être moins performant que WebP2. +Si on en croit le retrait du support de JPEG XL dans Chrome et Firefox, je m'attends à ce que JPEG XL soit moins performant que WebP2 et n'apporte que peu par rapport à AVIF. + + +### Le jeu de données + +J'ai constitué moi-même ce jeu de données. +Je ne possède pas les droits sur les images, mais j'ai privilégié des images libres de droit quand c'était possible. +J'ai privilégié la variété à la liberté d'utilisation. +Un jeu de données totalement libre aurait pu être constitué mais m'aurait demandé beaucoup plus de temps. +Bien que je trouve ça ridicule, techniquement, je possède un droit sur le jeu de données. +Je vous informe donc que vous êtes libre de le réutiliser et de le modifier tant que vous respectez les licences originales des images. + +Vous pouvez le télécharger depuis ce [fichier torrent](res/datasets_test_imgs_ache.torrent) ou ce [lien magnet 🧲](magnet:?xt=urn:btih:3217ff465d9c13cdbb2f7b1d776ee0f2a152ba54&dn=datasets_test_imgs_ache&tr=udp://tracker.opentrackr.org:1337/announce&tr=https://tracker1.520.jp/announce&tr=udp://tracker.torrent.eu.org:451/announce&tr=http://bt.endpot.com/announce). + +Jeu de données | Format | Nombre d'images | Description | Droits d'utilisation +---------------|----------------|-----------------|-------------|-------------------- +low_def_imgs_set_jpg | jpg | 39 | Sous-ensemble du [jeu de données de l'USC-SIPI](https://sipi.usc.edu/database/).[^USC-SIPI] | Complexes mais [admis qu'on peut les utiliser à des fins de recherche](https://sipi.usc.edu/database/copyright.php) +png_random | png | 38 | Des images PNG variées issues d'une expérience de quelques heures sur internet. Une sélection a été faite afin de ne pas avoir trop d'images similaires. | Un mixe de « libre pour un usage personnel », CC et certainement partagée avec une licence restrictive. +photos_imgs_set_jpg | jpg | 16 | Photos personnelles de vacances et de voyage. | Je possède les droits et j'autorise l'utilisation sous licence CC-BY 2.0 ache. +high_def_imgs_set_jpg | jpg | 28 | Images de qualité professionnelle et libres de droit issues du site Pexels. L'attribution de chaque image est donnée dans le nom de la photo. | [Libre d'utilisation](https://www.pexels.com/license/) +selected_holliday _photos_jpg | jpg | 24 | Sous-ensemble du [jeu de données de l'INRIA](https://lear.inrialpes.fr/~jegou/data.php#holidays). | Propriété de l'INRIA[^source_inria]. Usage conditionné au fait de citer le papier dont il est issu. +xkcd | png | 24 | Sous-ensemble de planche de la bande dessinée en ligne XKCD. | [CC-BY-NC](https://xkcd.com/license.html) + +[^USC-SIPI]: Images de faible résolution, principalement issues de la catégorie *divers* (misc). +[^source_inria]: Issue de l'article « Hamming Embedding and Weak geometry consistency for large scale image search », présenté à la 10ᵉ conférence européenne de vision par ordinateur en octobre 2008. + + +### Les encodeurs + +J'ai utilisé une version précise des encodeurs, la plus récente disponible. +Cela améliore la reproductibilité de l'expérience. + +Format | Support de la transparence | Intervalle de qualité | Intervalle d'effort | Encodeur / Décodeur | Version +-----|---|-------|---------------------|-----------------------|------ +AVIF | ✔️ | 0-100 | Option indisponible | heic-enc / heic-convert | 1.15.2 +HEIF | ✔️ | 0-100 | Option indisponible | heic-enc / heic-convert | 1.15.2 +JXL | ✔️ | 0-100 | 1-9[^zap] | cjxl / djxl | v0.8.1 (c27d4992) +WebP | ✔️ | 0-100 | 0-7 | cwebp / dwebp | 1.3.0 (libsharpyuv: 0.2.0) +WebP2 | ✔️ | 0-100 | 0-10 | cwp2 / dwp2 | 0.0.1 (b80553d) + +[^zap]: Chaque niveau d'effort possède une représentation textuelle et je trouve ça très drôle. + + Niveau | Textuelle | Traduction + --|---|---- + 1 | lightning | lumière ⚡ + 2 | thinder | tonnerre 🌩️ + 3 | falcon | faucon + 4 | cheetah | guépard + 5 | hare | lièvre + 6 | wombat | wombat + 7 | squirrel | écureuil 🐿️ + 8 | kitten | chat 😸 + 9 | Tortoise | tortue 🐢 + +Il est à noter que les formats et encodeurs ne proposent pas tous les mêmes fonctionnalités. +AVIF ni WeBP2 ne proposent pas par exemple le décodage progressif. +Je n'ai cependant jamais activé cette option dans l'encodeur cjxl. + +Lorsque cela a été possible, j'ai activé le calcul parallèle, c'est-à-dire avec WebP et WebP2. +Pour WebP2 j'ai limité à 8 le nombre de fils d'exécution alors que WebP ne proposait pas cette option. + +De même, les paramètres entre encodeur ne sont pas comparables ! ⚠️ +Ainsi `50` de qualité pour AVIF **ne correspond pas** à `50` de qualité pour WebP2. + +:::note +Une erreur de ma part a été d'inclure la qualité 100 de JPEG XL qui active automatiquement son mode compression sans perte alors que les autres encodeurs ont besoin d'une option pour ça. +::: + + +#### Support des navigateurs + +En aout 2023, date d'écriture de cet article: + + - WebP bénéficie du meilleur support + - AVIF possède également un très bon support mais Edge et certains autres navigateurs plus confidentiels rechignent à le supporter. + - JXL n'est supporté que pas Safari mais le support a existé de manière expérimentale sur Chrome et Firefox. + Il a été retiré de Chromium. + Pour Firefox, il n'est présent qu'en _nightly_ en activant l'option `image.jxl.enabled`. + - HEIF est supporté par les versions modernes de Safari. + - WebP2 n'a aucun support. + +Support de WebP par les différents navigateurs + +
+ +Support de AVIF par les différents navigateurs + +
+ +Support de JPEG XL par les différents navigateurs + +Support des différents formats disponible actuellement sur le site [canisuse.com](https://caniuse.com/). + + +#### Fonctionnalités + +Format | Animation | HDR | Décodage progressif | Nombre maximum de chanaux | Dimensions maximales +-------|-----------|-----|---------------------|---------------------------|-------------------- +WebP | ✔️ | ✖️ | ✖️ | 4 | 16 383 x 16 383 | +AVIF | ✔️ | 10bits | ✖️ | 5 | 8193x4320 | +JXL | ✔️ | 12bits | ✔️ | 5 | 1 703 741 823 x 1 703 741 823 | +WebP2 | ✔️ | 10bits | 🤷 | 4099 | 16 383 x 16 383 | + +AVIF supporte des dimensions arbitraires mais alors l'image est découpée en blocs de 8193x4320. +Aucune cohérence n'est assurée à la liaison entre ces blocs, ce qui peut provoquer des artéfacts. + +Il est prévu de supporter le décodage incrémental dans le README de l'encodeur de WebP2. +Est-ce synonyme de décodage progressif ? Certainement. +Est-ce déjà implémenté ? Je n'en sais rien. + + +Analyse des images produites +---------------------------- + +On va analyser les erreurs, puis les performances de chaque encodeur. + +### Les erreurs d'encodage 🐛 🐞 + +Il existe deux types d'erreurs: + 1. Lorsque le processus d'encodage plante ou échoue et retourne ainsi un code d'erreur différent de 0. + 1. Lorsque qu'à l'issue du processus d'encodage, l'image générée est particulièrement différente de l'image source. + Je vais poser arbitrairement un seuil de `0.4` de similarité[^dis], ainsi toute image ayant un seuil DSSIM supérieur sera considérée comme en erreur. + + +#### Encodeur heic-enc des formats AVIF et HEIF + +L'encodeur heic-enc a un problème de gestion des données EXIF, l'image n'est pas correctement retournée. +Ainsi, le calcul de la similarité structurelle n'a pas pu fonctionner, les images originales et produites n'ayant pas les mêmes dimensions. +Cette erreur affecte le format AVIF et HEIF. +Afin de gérer ce cas, les données EXIF ont été supprimées pour tous les images. +Cela ne devrait pas affecter la taille de l'image produite. +Cette erreur ayant été contournée, elle n'a pas été comptabilisée comme une erreur. + + +Également sur certain PNG l'image produite était particulièrement différente de l'image source. +Cela semble être un problème de décodage de l'image source puisque les deux formats sont affectés. +De plus l'image produite est reconnaissable mais fortement détériorée. +9 images sources sont affectées, l'erreur est systématique sur chaque image produite depuis ces images sources. + + +#### Encodeur cjxl + +L'encodeur jxl réussi toujours mais l'étape de décodage a échoué 3 fois. +Ceci laisse à penser que **jxl n'a pas produit une image valide**. +C'est en quelque sorte le pire bug possible. +En testant avec [une autre implémentation de decodeur JPEG XL](https://github.com/tirr-c/jxl-oxide), on obtient une erreur plus explicite « Unexpected end of file ». + +Il y a également eu 3 images générées qui sont particulièrement différentes de l'image source. +Cependant, contrairement a l'encodeur heic-enc, cette erreur se produit uniquement lorsque les images sont encodées avec une qualité de 100 et un effort de niveau 1, nommé lightning ⚡. +Les 3 images affectées par ce bug sont méconnaissables mais curieusement, le set de couleurs utilisées est reconnaissable. +On peut noter que ces 3 images ont également été des images qui n'ont pas été représentées fidèlement par heic-enc. +Il est peu probable que ça soit une coïncidence mais c'est possible. + + +#### Encodeur cwebp et cwp2 + + +L'encodeur WebP echoue sur 6 images et celui de WebP2 sur 1 images. + +L'erreur d'encodage de WebP2 est claire : `WP2_STATUS_BAD_DIMENSION`. +En effet l'image en question est effectivement de dimension particulièrement grande. +C'est la seule erreur. + +L'encodeur de WebP échoue sur la même image, pour la même raison, mais également sur 5 autres images. +Dans ces cas l'erreur retournée est : + +~~~ +Saving file 'test_crash.webp' +Error! Cannot encode picture as WebP +Error code: 6 (PARTITION0_OVERFLOW: Partition #0 is too big to fit 512k. +To reduce the size of this partition, try using less segments with the -segments option, and eventually reduce the number of header bits using -partition_limit. More details are available in the manual (`man cwebp`) +~~~ + +Étant donné que l'erreur ne se produit qu'avec simultanément une qualité à 90 ou 100 et un effort à 0 ou 1, je considère ceci comme un cas limite que l'encodeur a du mal à gérer. +Je n'ai pas plus investigué. + +Je note que, pour ces deux encodeurs, il n'y a pas d'erreur de similarité trop faible entre l'image produite et l'image source. +C'est une très bonne chose. 👌 + + +#### Conclusion de l'étude des erreurs + +Seul le format JPEG XL échoue à encoder des images et produit des glitchs. +La partie décodage des images PNG de `heic-enc` doit être améliorée, elle présente de **très nombreux bugs** qui produisent également des glitchs. +Les formats WebP et WebP2 posent des problèmes au niveau des dimensions limitées supportées par le format. +WebP présente un bug dans son implémentation officielle dans certains cas limites. + +À partir de maintenant, on va exclure les cas présentant des erreurs de nos statistiques. +Ainsi, AVIF et HEIF auront 9 images en moins. +JPEG XL, WebP et WebP2 n'auront pas de données correspondant à certains paramètres. + +Les bugs rencontrés par JPEG XL ont été résolus désormais mais le correctif n'est pas encore disponible dans la dernière version publiée. +J'ai alerté du [bug d'encodage de heif-enc](https://github.com/strukturag/libheif/issues/937). +Je n'ai pas fait la même chose pour WebP, le processus nécessitant un compte Google. + + +### Taux de compression comparé à la qualité de l'image produite + +Pour facilité les comparaisons, je vais *comparer par jeux de données*. +Ils se trouvent qu'effectivement beaucoup d'images d'un même jeu de données suivent les mêmes tendances. +Je vais donc essayer de lister les différentes tendances. + + +#### Images basses définition + +Au sein du jeu de données `low_def_imgs_set_jpg` on retrouve 3 tendances. +Un petit ensemble d'images où les formats AVIF et HEIF s'en sortent particulièrement mal, 3 images où la variation des performances est très grande et le reste où tous les formats d'image ont des performances équivalentes à peu près. + +Dans environ 13 cas, les formats AVIF et HEIC sont moins performants que tous les autres. +La similarité maximale atteinte est éloignée de 0. +À la vue des images, il ne semble pas que les images concernées aient un point commun évident. +On peut soit expliqué ces faibles performances par un problème de décodage soit que les algorithmes ne sont pas efficaces sur ces images. + +Sur 3 images, il est clair que les résultats sont très variés. Les performances de chaque format dépends beaucoup de l'effort et de la qualité configurée. +Malgré les fortes variations, il y a une segmentation claire où WebP2 est clairement plus performant que ses concurrents. +AVIF et HEIC sont correctes mais JPEG XL est à la traine derrière WebP. +Les images concernées sont clairement des images de tests en niveau de gris. + +Enfin, pour le reste des images de faible résolution, on constate que les performances de tous les formats d'images sont à peu près identiques. +Seul WebP est légèrement à la traine. + + +#### PNG aléatoires + +Ici, il n'est pas évident de définir une tendance. +De manière générale, AVIF équivaut à WebP2 et font tous deux mieux que JPEG XL. +WebP est généralement plutôt mauvais, mais il n'est pas rare qu'il égale JXL en performance. +Mais ce n'est présenté aussi clairement que sur certains graphes. + +Tendance générale des PNG, ratio de compression en fonction de la qualité pour les différents formats d'images + + +On remarque cependant que la légère dominance de AVIF sur HEIF est claire dans ce jeu de donnée. +Aussi, sur un nombre assez important d'images les formats AVIF et HEIF arrivent à réduire la taille de l'image en réduisant sa qualité alors que les autres algorithmes atteignent un seuil (chacun un seuil différent) qu'ils n'arrivent pas à dépasser. + + +Certaines images (👽) ont un graphe très particulier ! + +Graphe de la qualité en fonction de la taille des différents formats pour l'image cat_donus_pixel_art + + +C'est le cas de `cat_donus_pixel_art` où JPEG XL est très bon en qualité 100 (sans perte) mais fait un peu moins bien que WebP sinon. WebP donne également de très bon résultat alors que WebP2 optimise difficilement la taille de l'image. AVIF donne de très mauvais résultats alors que HEIF augmente systématiquement la taille de l'image (sauf en qualité 0). + +Aussi sur de grandes images très détaillées, JPEG XL peu devenir intéressant. +C'est le cas par exemple sur l'image de la capture d'écran de la page d'accueil de où JPEG XL devient aussi intéressant que WebP2, lui-même meilleur que AVIF. +JPEG XL est plus performant sur de grosses images (en dimension) comme `eiffel_tower_pngwing`, `screenshot_firefox_c_quirks_fr_ache_one`. + +Graphe de la qualité en fonction de la taille des différents formats pour un Screenshot de Wikipédia + + +#### Photos personnelles de vacances + +La tendance est très claire dans ce jeu de données. +Tous les formats excepté WebP sont excellents. + +Tendance générale des photos personnelles, ratio de compression en fonction de la qualité pour les différents formats d'images + + +On notera les performances médiocres de WebP2 lorsque la qualité est de 100%. +Quasiment ✕ 6 sur l'image `nantes_église` et quasiment ✕ 5 sur `sleeping_bridge_beauty`. +AVIF souffre du même problème sur la qualité 100 et 90 mais pas dans de telle proportion. +JPEG XL ne rencontre **jamais** ce problème. + + +#### Photos de haute définition + +La tendance est identifiable. +Tous les formats excepté WebP sont excellents. +On peut même classer les formats JPEG XL premier, AVIF/HEIF deuxième puis WebP2 troisième. +Il faut noter que ce classement n'est vrai pas vrai pour tous les images. +Aussi, les trois formats ont de très bons résultats, si bien que la différence entre WebP2 et JPEG XL n'est pas si notable que ça. + +Tendance générale des photos de haute résolution, ratio de compression en fonction de la qualité pour les différents formats d'images + + +Globalement la même tendance que le jeu de données de photo personnelles de vacances. +Les performances atteintes sont en moyennes plus grande cependant. + +Aucune image ne sort du lot, excepté les performances de WebP2 en qualité 100% et effort 0. +Une taille initiale multipliée par 8.5 ! + + +#### Photos du jeu de données de l'INRIA + +Même analyse que les deux jeux de données précédents. + +Tendance générale des photos du jeu de données de l'INRIA, ratio de compression en fonction de la qualité pour les différents formats d'images + + +#### Images PNG issues de XKCD + +Très mauvais résultats pour JPEG XL globalement pire que WebP, sauf sur une image, où il excelle en mode sans perte. (`1416.jpg`). +WebP2 s'en sort bien. +AVIF/HEIF également, tout à fait équivalent. +On rencontre deux tendances. + +Tendance générale des PNG issues de XKCD, ratio de compression en fonction de la qualité pour les différents formats d'images + +La première, la plus courante, une domination de WebP2 et AVIF/HEIF (équivalent) sur les autres formats. +On note par contre que WebP2 est plus performant sur certaines images (136, 209, 399, 695, 731, 1071). +Le point commun de ces images est qu'elles ont des couleurs, souvent beaucoup de couleurs. +Mais il y a des images en couleur où le gain de performance n'est pas significatif. + +La deuxième, que l'on rencontre sur les images 1123, 1144 et dans une moindre mesure 376, 1163, 1195 et 1445 est que JXL est meilleur que les autres lorsque la qualité est bonne et WebP est meilleur que les autres lorsque la qualité est faible. +Cette tendance était difficilement prévisible. +Le point commun de ces images est leur faible dimension. + + +Tendance des PNG de XKCD où WebP et JXL dominent alternativement les autres formats, ratio de compression en fonction de la qualité pour les différents formats d'images + +Une exception est l'image 1416, celle qui a fait bugger l'encodeur `heic-enc`. + - Elle a été très dur à compresser pour les différents encodeurs. + - WebP n'a pas une seule image plus petite que l'originale. + - JXL a besoin d'avoir une qualité de 100 pour produire des images plus petites que l'image originale. + - WebP2 a de très bon résultat en qualité 100, sinon il n'arrive pas à grand-chose même si parfois il arrive à faire plus léger que l'image originale. + + +### Vitesse globale des encodeurs + +À qualité égale, les encodeurs prennent des temps très différents. +Ici, en prenant comme base les points du format AVIF et en comparant aux points de similarité et ratio similaire, on obtient ce graphique: + +:::attention +L'échelle est logarithmique afin d'afficher toutes les données sur le graphique. +::: + +Temps d'encodage des encodeurs. + +On voit ainsi que WebP est le format globalement le plus rapide. +Suivent ensuite AVIF et HEIF mais JPEG XL est très proche. Il est même en moyenne plus rapide. +L'anomalie ici est WebP2 qui est globalement beaucoup plus lent (notez que l'échelle est logarithmique ...) + +AVIF et HEIF sont les plus constants, ce sont les seuls encodeurs à encoder toutes les images en moins de 10s. +JPEG XL a mis jusqu'à 2min pour encoder certaines images alors WebP2 a mis parfois 2h à encoder une image ! + + +### Étude des temps de décodage + +J'ai étudié le temps de décodage des différents formats, mais **ils sont tous à peu près identiques**. +Toutes les images sont décodées en 10s maximum par touts les formats d'images. + +:::note +Ce résultat est assez surprenant. +Il ne serait pas étonnant qu'une erreur se soit glissée dans ces mesures et que par exemple ce soit le temps d'écriture sur le disque qui soit mesuré ici. + +Le plus propable est que le temps d'encodage PNG soit d'un ordre plus grand que le décodage des différents formats. +::: + +Une légère tendance pour JPEG XL à être plus lent qu'AVIF et WebP2 à être plus rapide qu'AVIF. + +Temps médian de décodage des encodeurs. + +Temps moyen de décodage des décodeurs. + + +:::information +Ici, je n'ai pas activé le décodage progressif de JPEG XL. +Il aurait été intéressant de voir si le décodage progressif de JPEG XL aurait permis un affichage plus rapide. +::: + + +### Rétrospective sur cette étude + +Je pense que cette étude peut être améliorée. +Je compte refaire en juillet 2024 cette comparaison et j'aimerais lister les points d'amélioration. + +1. Améliorer la reproductibilité avec une image Docker. + +2. Faire une comparaison à BPP égal (temps / qualité) et à qualité égale (BPP et temps). + C'est particulièrement compliqué mais c'est faisable. + +3. Étudier plus d'encodeurs. + Ici, j'ai fait l'amalgame encodeur ≈ format, mais il est vrai que la qualité de l'encodeur joue un rôle particulier dans la représentation d'un format. + +4. Utiliser plusieurs métriques de qualité d'image. + +5. Inclure le format [BPG (Better Portable Graphic)](https://bellard.org/bpg/) pour comparaison. + +1. J'ai voulu comparer uniquement des encodages d'images avec perte. Sauf que JPEG XL en qualité 100 est automatiquement un format sans perte. ❌ + La prochaine fois, j'aimerais inclure les versions sans perte des différents encodeurs. + +6. Vérifier la validité des temps de décodage. + + +Conclusion +---------- + +Notez que dans tous les cas AVIF, WebP2 et JPEG XL sont généralement plus intéressants que JPEG ou PNG. + +En prenant en compte le support actuel des navigateurs (aout 2023). +N'utilisez AVIF que si Edge (ou QQ Browser) n'est pas essentiel pour vous. +Si vous pouvez, utilisez la balise [picture](https://developer.mozilla.org/fr/docs/Web/HTML/Element/picture) pour vous préparer aux futurs formats d'images. +Vous pourrez ainsi dès aujourd'hui proposer AVIF à ceux qui le supportent, sinon utilisez WebP[^png]. + +[^png]: Ou PNG si vous devez supporter de très vieux navigateurs. + +En prenant en compte uniquement les qualités et défauts des différents encodeurs, par exemple dans une optique de stockage, ou dans un futur où ces formats sont supportés par le navigateur. + +**JPEG XL** devrait être utilisé pour toutes les **photographies**. +Pour les PNG, il est difficile de choisir entre AVIF et WebP2 dans le cas général, choisissez WebP2 avec un effort de 6 et une qualité de 90 ou AVIF une qualité entre 80 et 90. +Si vous traitez vos images manuellement, testez AVIF et WebP2, voyez celui qui colle le mieux à vos données. +Si vous effectuez un **traitement automatique**, utilisez de préférence **WebP2**, mais gardez en tête que AVIF est un très bon candidat également, notamment si vous êtes contrains en temps d'encodage ou charge CPU ou que vous avez des images de dimensions arbitrairement grandes. + +Ainsi, ce que j'observe entre en contradiction avec d'autres études sur le sujet. +Cela peut être dû aux avancés depuis des encodeurs. +En effet, libjxl et libheif sont en développement actif alors que [libwp2](https://chromium.googlesource.com/codecs/libwebp2/) est en pause. +Malgré la maturité de l'encodeur, il semble que [WebP2 ne dépassera pas le stade expérimental](https://chromium.googlesource.com/codecs/libwebp2/+/1251ca748c17278961c0d0059b744595b35a4943%5E%21/). + +:::details +Ressources complémentaires + + - Le [fichier torrent](res/datasets_test_imgs_ache.torrent) ([lien magnet 🧲](magnet:?xt=urn:btih:3217ff465d9c13cdbb2f7b1d776ee0f2a152ba54&dn=datasets_test_imgs_ache&tr=udp://tracker.opentrackr.org:1337/announce&tr=https://tracker1.520.jp/announce&tr=udp://tracker.torrent.eu.org:451/announce&tr=http://bt.endpot.com/announce)). + - Les [données brutes](res/raw_data_images_format_2023.csv). + +::: + + + + + diff --git a/articles/res/avif_support.avif b/articles/res/avif_support.avif new file mode 100644 index 0000000..40c3c9d Binary files /dev/null and b/articles/res/avif_support.avif differ diff --git a/articles/res/avif_support.png b/articles/res/avif_support.png new file mode 100644 index 0000000..f127864 Binary files /dev/null and b/articles/res/avif_support.png differ diff --git a/articles/res/iframe_imgs/Encoding time by encoder.html b/articles/res/iframe_imgs/Encoding time by encoder.html new file mode 100644 index 0000000..2441145 --- /dev/null +++ b/articles/res/iframe_imgs/Encoding time by encoder.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/Encoding time by encoder.png b/articles/res/iframe_imgs/Encoding time by encoder.png new file mode 100644 index 0000000..41c5925 Binary files /dev/null and b/articles/res/iframe_imgs/Encoding time by encoder.png differ diff --git a/articles/res/iframe_imgs/General trend for PNG images from XKCD.html b/articles/res/iframe_imgs/General trend for PNG images from XKCD.html new file mode 100644 index 0000000..7e1f38d --- /dev/null +++ b/articles/res/iframe_imgs/General trend for PNG images from XKCD.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/General trend for PNG images from XKCD.png b/articles/res/iframe_imgs/General trend for PNG images from XKCD.png new file mode 100644 index 0000000..27fc76b Binary files /dev/null and b/articles/res/iframe_imgs/General trend for PNG images from XKCD.png differ diff --git a/articles/res/iframe_imgs/General trend for photos in the INRIA dataset.html b/articles/res/iframe_imgs/General trend for photos in the INRIA dataset.html new file mode 100644 index 0000000..7a62294 --- /dev/null +++ b/articles/res/iframe_imgs/General trend for photos in the INRIA dataset.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/General trend for photos in the INRIA dataset.png b/articles/res/iframe_imgs/General trend for photos in the INRIA dataset.png new file mode 100644 index 0000000..95a23b2 Binary files /dev/null and b/articles/res/iframe_imgs/General trend for photos in the INRIA dataset.png differ diff --git a/articles/res/iframe_imgs/General trend in PNG images from XKCD where JXL and WebP dominate other formats.html b/articles/res/iframe_imgs/General trend in PNG images from XKCD where JXL and WebP dominate other formats.html new file mode 100644 index 0000000..f639d3c --- /dev/null +++ b/articles/res/iframe_imgs/General trend in PNG images from XKCD where JXL and WebP dominate other formats.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/General trend in PNG images from XKCD where JXL and WebP dominate other formats.png b/articles/res/iframe_imgs/General trend in PNG images from XKCD where JXL and WebP dominate other formats.png new file mode 100644 index 0000000..faa131d Binary files /dev/null and b/articles/res/iframe_imgs/General trend in PNG images from XKCD where JXL and WebP dominate other formats.png differ diff --git a/articles/res/iframe_imgs/General trend in PNGs.html b/articles/res/iframe_imgs/General trend in PNGs.html new file mode 100644 index 0000000..ccf0721 --- /dev/null +++ b/articles/res/iframe_imgs/General trend in PNGs.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/General trend in PNGs.png b/articles/res/iframe_imgs/General trend in PNGs.png new file mode 100644 index 0000000..73e5a9d Binary files /dev/null and b/articles/res/iframe_imgs/General trend in PNGs.png differ diff --git a/articles/res/iframe_imgs/General trend in high-resolution photos.html b/articles/res/iframe_imgs/General trend in high-resolution photos.html new file mode 100644 index 0000000..5797148 --- /dev/null +++ b/articles/res/iframe_imgs/General trend in high-resolution photos.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/General trend in high-resolution photos.png b/articles/res/iframe_imgs/General trend in high-resolution photos.png new file mode 100644 index 0000000..e0a8a6b Binary files /dev/null and b/articles/res/iframe_imgs/General trend in high-resolution photos.png differ diff --git a/articles/res/iframe_imgs/General trend in low-resolution photos.html b/articles/res/iframe_imgs/General trend in low-resolution photos.html new file mode 100644 index 0000000..bae673e --- /dev/null +++ b/articles/res/iframe_imgs/General trend in low-resolution photos.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/General trend in low-resolution photos.png b/articles/res/iframe_imgs/General trend in low-resolution photos.png new file mode 100644 index 0000000..f8cdc02 Binary files /dev/null and b/articles/res/iframe_imgs/General trend in low-resolution photos.png differ diff --git a/articles/res/iframe_imgs/General trend in personal photos.html b/articles/res/iframe_imgs/General trend in personal photos.html new file mode 100644 index 0000000..e711c11 --- /dev/null +++ b/articles/res/iframe_imgs/General trend in personal photos.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/General trend in personal photos.png b/articles/res/iframe_imgs/General trend in personal photos.png new file mode 100644 index 0000000..249ef4c Binary files /dev/null and b/articles/res/iframe_imgs/General trend in personal photos.png differ diff --git a/articles/res/iframe_imgs/Mean decoding time by decoder.html b/articles/res/iframe_imgs/Mean decoding time by decoder.html new file mode 100644 index 0000000..6a25821 --- /dev/null +++ b/articles/res/iframe_imgs/Mean decoding time by decoder.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/Mean decoding time by decoder.png b/articles/res/iframe_imgs/Mean decoding time by decoder.png new file mode 100644 index 0000000..3a10e75 Binary files /dev/null and b/articles/res/iframe_imgs/Mean decoding time by decoder.png differ diff --git a/articles/res/iframe_imgs/Median decoding time by decoder.html b/articles/res/iframe_imgs/Median decoding time by decoder.html new file mode 100644 index 0000000..eaa5b86 --- /dev/null +++ b/articles/res/iframe_imgs/Median decoding time by decoder.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/Median decoding time by decoder.png b/articles/res/iframe_imgs/Median decoding time by decoder.png new file mode 100644 index 0000000..a444a82 Binary files /dev/null and b/articles/res/iframe_imgs/Median decoding time by decoder.png differ diff --git a/articles/res/iframe_imgs/Notably poor heic-enc performance.html b/articles/res/iframe_imgs/Notably poor heic-enc performance.html new file mode 100644 index 0000000..2085a56 --- /dev/null +++ b/articles/res/iframe_imgs/Notably poor heic-enc performance.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/Notably poor heic-enc performance.png b/articles/res/iframe_imgs/Notably poor heic-enc performance.png new file mode 100644 index 0000000..18143f6 Binary files /dev/null and b/articles/res/iframe_imgs/Notably poor heic-enc performance.png differ diff --git a/articles/res/iframe_imgs/Performances de heic-enc notablement faibles.html b/articles/res/iframe_imgs/Performances de heic-enc notablement faibles.html new file mode 100644 index 0000000..f628aa6 --- /dev/null +++ b/articles/res/iframe_imgs/Performances de heic-enc notablement faibles.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/Performances de heic-enc notablement faibles.png b/articles/res/iframe_imgs/Performances de heic-enc notablement faibles.png new file mode 100644 index 0000000..d4aab0a Binary files /dev/null and b/articles/res/iframe_imgs/Performances de heic-enc notablement faibles.png differ diff --git "a/articles/res/iframe_imgs/R\303\251sultats \303\251parpill\303\251s.html" "b/articles/res/iframe_imgs/R\303\251sultats \303\251parpill\303\251s.html" new file mode 100644 index 0000000..fec9bdc --- /dev/null +++ "b/articles/res/iframe_imgs/R\303\251sultats \303\251parpill\303\251s.html" @@ -0,0 +1 @@ +
\ No newline at end of file diff --git "a/articles/res/iframe_imgs/R\303\251sultats \303\251parpill\303\251s.png" "b/articles/res/iframe_imgs/R\303\251sultats \303\251parpill\303\251s.png" new file mode 100644 index 0000000..db8c621 Binary files /dev/null and "b/articles/res/iframe_imgs/R\303\251sultats \303\251parpill\303\251s.png" differ diff --git a/articles/res/iframe_imgs/Scattered results.html b/articles/res/iframe_imgs/Scattered results.html new file mode 100644 index 0000000..c731ae5 --- /dev/null +++ b/articles/res/iframe_imgs/Scattered results.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/Scattered results.png b/articles/res/iframe_imgs/Scattered results.png new file mode 100644 index 0000000..1da4c53 Binary files /dev/null and b/articles/res/iframe_imgs/Scattered results.png differ diff --git a/articles/res/iframe_imgs/Temps d'encodage par encodeur.html b/articles/res/iframe_imgs/Temps d'encodage par encodeur.html new file mode 100644 index 0000000..d4acbee --- /dev/null +++ b/articles/res/iframe_imgs/Temps d'encodage par encodeur.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/Temps d'encodage par encodeur.png b/articles/res/iframe_imgs/Temps d'encodage par encodeur.png new file mode 100644 index 0000000..95b5dae Binary files /dev/null and b/articles/res/iframe_imgs/Temps d'encodage par encodeur.png differ diff --git "a/articles/res/iframe_imgs/Temps moyen de d\303\251codage par d\303\251codeur.html" "b/articles/res/iframe_imgs/Temps moyen de d\303\251codage par d\303\251codeur.html" new file mode 100644 index 0000000..23d7236 --- /dev/null +++ "b/articles/res/iframe_imgs/Temps moyen de d\303\251codage par d\303\251codeur.html" @@ -0,0 +1 @@ +
\ No newline at end of file diff --git "a/articles/res/iframe_imgs/Temps moyen de d\303\251codage par d\303\251codeur.png" "b/articles/res/iframe_imgs/Temps moyen de d\303\251codage par d\303\251codeur.png" new file mode 100644 index 0000000..8011a71 Binary files /dev/null and "b/articles/res/iframe_imgs/Temps moyen de d\303\251codage par d\303\251codeur.png" differ diff --git "a/articles/res/iframe_imgs/Temps m\303\251dian de d\303\251codage par d\303\251codeur.html" "b/articles/res/iframe_imgs/Temps m\303\251dian de d\303\251codage par d\303\251codeur.html" new file mode 100644 index 0000000..bb3f549 --- /dev/null +++ "b/articles/res/iframe_imgs/Temps m\303\251dian de d\303\251codage par d\303\251codeur.html" @@ -0,0 +1 @@ +
\ No newline at end of file diff --git "a/articles/res/iframe_imgs/Temps m\303\251dian de d\303\251codage par d\303\251codeur.png" "b/articles/res/iframe_imgs/Temps m\303\251dian de d\303\251codage par d\303\251codeur.png" new file mode 100644 index 0000000..c35f26d Binary files /dev/null and "b/articles/res/iframe_imgs/Temps m\303\251dian de d\303\251codage par d\303\251codeur.png" differ diff --git "a/articles/res/iframe_imgs/Tendance des images PNG de XKCD o\303\271 JXL et WebP dominent les autres formats.html" "b/articles/res/iframe_imgs/Tendance des images PNG de XKCD o\303\271 JXL et WebP dominent les autres formats.html" new file mode 100644 index 0000000..d418a4c --- /dev/null +++ "b/articles/res/iframe_imgs/Tendance des images PNG de XKCD o\303\271 JXL et WebP dominent les autres formats.html" @@ -0,0 +1 @@ +
\ No newline at end of file diff --git "a/articles/res/iframe_imgs/Tendance des images PNG de XKCD o\303\271 JXL et WebP dominent les autres formats.png" "b/articles/res/iframe_imgs/Tendance des images PNG de XKCD o\303\271 JXL et WebP dominent les autres formats.png" new file mode 100644 index 0000000..bed93c2 Binary files /dev/null and "b/articles/res/iframe_imgs/Tendance des images PNG de XKCD o\303\271 JXL et WebP dominent les autres formats.png" differ diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des PNG.html" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des PNG.html" new file mode 100644 index 0000000..22bfdb4 --- /dev/null +++ "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des PNG.html" @@ -0,0 +1 @@ +
\ No newline at end of file diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des PNG.png" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des PNG.png" new file mode 100644 index 0000000..556a534 Binary files /dev/null and "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des PNG.png" differ diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images PNG issues de XKCD.html" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images PNG issues de XKCD.html" new file mode 100644 index 0000000..7a9db81 --- /dev/null +++ "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images PNG issues de XKCD.html" @@ -0,0 +1 @@ +
\ No newline at end of file diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images PNG issues de XKCD.png" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images PNG issues de XKCD.png" new file mode 100644 index 0000000..3c18865 Binary files /dev/null and "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images PNG issues de XKCD.png" differ diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images de r\303\251solutions faibles.html" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images de r\303\251solutions faibles.html" new file mode 100644 index 0000000..e340bea --- /dev/null +++ "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images de r\303\251solutions faibles.html" @@ -0,0 +1 @@ +
\ No newline at end of file diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images de r\303\251solutions faibles.png" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images de r\303\251solutions faibles.png" new file mode 100644 index 0000000..454665f Binary files /dev/null and "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des images de r\303\251solutions faibles.png" differ diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos de haute r\303\251solution.html" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos de haute r\303\251solution.html" new file mode 100644 index 0000000..ac8a0b7 --- /dev/null +++ "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos de haute r\303\251solution.html" @@ -0,0 +1 @@ +
\ No newline at end of file diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos de haute r\303\251solution.png" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos de haute r\303\251solution.png" new file mode 100644 index 0000000..61ae28e Binary files /dev/null and "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos de haute r\303\251solution.png" differ diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos du jeu de donn\303\251es de l'INRIA.html" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos du jeu de donn\303\251es de l'INRIA.html" new file mode 100644 index 0000000..5dd1e14 --- /dev/null +++ "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos du jeu de donn\303\251es de l'INRIA.html" @@ -0,0 +1 @@ +
\ No newline at end of file diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos du jeu de donn\303\251es de l'INRIA.png" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos du jeu de donn\303\251es de l'INRIA.png" new file mode 100644 index 0000000..78803f4 Binary files /dev/null and "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos du jeu de donn\303\251es de l'INRIA.png" differ diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos personnelles.html" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos personnelles.html" new file mode 100644 index 0000000..d62587a --- /dev/null +++ "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos personnelles.html" @@ -0,0 +1 @@ +
\ No newline at end of file diff --git "a/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos personnelles.png" "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos personnelles.png" new file mode 100644 index 0000000..9595796 Binary files /dev/null and "b/articles/res/iframe_imgs/Tendance g\303\251n\303\251rale des photos personnelles.png" differ diff --git a/articles/res/iframe_imgs/cat_donus_pixel_art_pngwing.html b/articles/res/iframe_imgs/cat_donus_pixel_art_pngwing.html new file mode 100644 index 0000000..253e433 --- /dev/null +++ b/articles/res/iframe_imgs/cat_donus_pixel_art_pngwing.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/cat_donus_pixel_art_pngwing.png b/articles/res/iframe_imgs/cat_donus_pixel_art_pngwing.png new file mode 100644 index 0000000..52120d6 Binary files /dev/null and b/articles/res/iframe_imgs/cat_donus_pixel_art_pngwing.png differ diff --git a/articles/res/iframe_imgs/eiffel_tower_pngwing.html b/articles/res/iframe_imgs/eiffel_tower_pngwing.html new file mode 100644 index 0000000..3724ae1 --- /dev/null +++ b/articles/res/iframe_imgs/eiffel_tower_pngwing.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/eiffel_tower_pngwing.png b/articles/res/iframe_imgs/eiffel_tower_pngwing.png new file mode 100644 index 0000000..0c2d721 Binary files /dev/null and b/articles/res/iframe_imgs/eiffel_tower_pngwing.png differ diff --git a/articles/res/iframe_imgs/screenshot_ache.html b/articles/res/iframe_imgs/screenshot_ache.html new file mode 100644 index 0000000..b3b16e5 --- /dev/null +++ b/articles/res/iframe_imgs/screenshot_ache.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/screenshot_ache.png b/articles/res/iframe_imgs/screenshot_ache.png new file mode 100644 index 0000000..637e204 Binary files /dev/null and b/articles/res/iframe_imgs/screenshot_ache.png differ diff --git a/articles/res/iframe_imgs/screenshot_firefox_c_quirks_fr_ache_one.html b/articles/res/iframe_imgs/screenshot_firefox_c_quirks_fr_ache_one.html new file mode 100644 index 0000000..2109fa4 --- /dev/null +++ b/articles/res/iframe_imgs/screenshot_firefox_c_quirks_fr_ache_one.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/screenshot_firefox_c_quirks_fr_ache_one.png b/articles/res/iframe_imgs/screenshot_firefox_c_quirks_fr_ache_one.png new file mode 100644 index 0000000..4d1a690 Binary files /dev/null and b/articles/res/iframe_imgs/screenshot_firefox_c_quirks_fr_ache_one.png differ diff --git a/articles/res/iframe_imgs/screenshot_firefox_wikipedia.html b/articles/res/iframe_imgs/screenshot_firefox_wikipedia.html new file mode 100644 index 0000000..7d85913 --- /dev/null +++ b/articles/res/iframe_imgs/screenshot_firefox_wikipedia.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/articles/res/iframe_imgs/screenshot_firefox_wikipedia.png b/articles/res/iframe_imgs/screenshot_firefox_wikipedia.png new file mode 100644 index 0000000..523d7c2 Binary files /dev/null and b/articles/res/iframe_imgs/screenshot_firefox_wikipedia.png differ diff --git a/articles/res/jxl_support.avif b/articles/res/jxl_support.avif new file mode 100644 index 0000000..9c97d9c Binary files /dev/null and b/articles/res/jxl_support.avif differ diff --git a/articles/res/jxl_support.png b/articles/res/jxl_support.png new file mode 100644 index 0000000..3dc659e Binary files /dev/null and b/articles/res/jxl_support.png differ diff --git a/articles/res/raw_data_images_format_2023.csv b/articles/res/raw_data_images_format_2023.csv new file mode 100644 index 0000000..cedaff5 --- /dev/null +++ b/articles/res/raw_data_images_format_2023.csv @@ -0,0 +1,170 @@ +filename_in, width, height +datasets_test/selected_holliday_photos_jpg/125801.jpg, 2048, 1536 +datasets_test/selected_holliday_photos_jpg/107700.jpg, 1920, 2560 +datasets_test/selected_holliday_photos_jpg/102202.jpg, 2816, 2112 +datasets_test/selected_holliday_photos_jpg/106701.jpg, 2448, 3264 +datasets_test/selected_holliday_photos_jpg/101702.jpg, 1536, 2048 +datasets_test/selected_holliday_photos_jpg/126001.jpg, 2048, 1536 +datasets_test/selected_holliday_photos_jpg/101901.jpg, 1536, 2048 +datasets_test/selected_holliday_photos_jpg/102402.jpg, 1536, 2048 +datasets_test/selected_holliday_photos_jpg/105800.jpg, 2816, 2112 +datasets_test/selected_holliday_photos_jpg/107200.jpg, 3264, 2448 +datasets_test/selected_holliday_photos_jpg/122706.jpg, 2816, 2112 +datasets_test/selected_holliday_photos_jpg/102900.jpg, 1536, 2048 +datasets_test/selected_holliday_photos_jpg/100201.jpg, 3264, 2448 +datasets_test/selected_holliday_photos_jpg/102302.jpg, 2048, 1536 +datasets_test/selected_holliday_photos_jpg/100800.jpg, 1840, 3264 +datasets_test/selected_holliday_photos_jpg/101000.jpg, 2448, 3264 +datasets_test/selected_holliday_photos_jpg/103701.jpg, 1536, 2048 +datasets_test/selected_holliday_photos_jpg/100901.jpg, 2448, 3264 +datasets_test/selected_holliday_photos_jpg/104500.jpg, 2048, 1536 +datasets_test/selected_holliday_photos_jpg/104900.jpg, 2048, 1536 +datasets_test/selected_holliday_photos_jpg/106903.jpg, 1920, 2560 +datasets_test/selected_holliday_photos_jpg/106603.jpg, 2448, 3264 +datasets_test/selected_holliday_photos_jpg/101800.jpg, 2048, 1536 +datasets_test/selected_holliday_photos_jpg/103901.jpg, 2048, 1536 +datasets_test/photos_imgs_set_jpg/eggs_before_a_cake.JPG, 4000, 3000 +datasets_test/photos_imgs_set_jpg/THE_tree.JPG, 4000, 3000 +datasets_test/photos_imgs_set_jpg/blur_beach_boy.jpg, 1512, 2016 +datasets_test/photos_imgs_set_jpg/france_random.JPG, 2304, 3072 +datasets_test/photos_imgs_set_jpg/sunset_on_the_field.jpg, 4608, 3456 +datasets_test/photos_imgs_set_jpg/sleeping_bridge_beauty.jpg, 4598, 3456 +datasets_test/photos_imgs_set_jpg/little_bug_macro.JPG, 4000, 3000 +datasets_test/photos_imgs_set_jpg/old_bridge_1.jpg, 3456, 4608 +datasets_test/photos_imgs_set_jpg/nantes_église.jpg, 1531, 2048 +datasets_test/photos_imgs_set_jpg/bug_macro.JPG, 3072, 2304 +datasets_test/photos_imgs_set_jpg/old_bridge_2.jpg, 3456, 4608 +datasets_test/photos_imgs_set_jpg/goood_dog.jpg, 3024, 4032 +datasets_test/photos_imgs_set_jpg/austria_random.JPG, 3072, 2304 +datasets_test/photos_imgs_set_jpg/italia_random.jpg, 3456, 4608 +datasets_test/photos_imgs_set_jpg/plants_macro.JPG, 4000, 3000 +datasets_test/photos_imgs_set_jpg/udon_tower.jpg, 2736, 3648 +datasets_test/xkcd/1492.png, 411, 354 +datasets_test/xkcd/1195.png, 201, 224 +datasets_test/xkcd/824.png, 740, 1064 +datasets_test/xkcd/1811.png, 362, 511 +datasets_test/xkcd/376.png, 271, 258 +datasets_test/xkcd/1445.png, 329, 214 +datasets_test/xkcd/492.png, 574, 524 +datasets_test/xkcd/1123.png, 123, 49 +datasets_test/xkcd/731.png, 740, 518 +datasets_test/xkcd/1071.png, 1524, 1524 +datasets_test/xkcd/1163.png, 466, 214 +datasets_test/xkcd/1144.png, 451, 57 +datasets_test/xkcd/887.png, 612, 6370 +datasets_test/xkcd/209.png, 740, 186 +datasets_test/xkcd/1133.png, 740, 3214 +datasets_test/xkcd/1792.png, 624, 561 +datasets_test/xkcd/399.png, 640, 283 +datasets_test/xkcd/136.png, 450, 477 +datasets_test/xkcd/1895.png, 651, 311 +datasets_test/xkcd/977.png, 650, 1990 +datasets_test/xkcd/1766.png, 574, 244 +datasets_test/xkcd/1416.png, 600, 600 +datasets_test/xkcd/695.png, 639, 862 +datasets_test/xkcd/1878.png, 740, 512 +datasets_test/high_def_imgs_set_jpg/forêt-mathias-reding-5837862.jpg, 3456, 5184 +datasets_test/high_def_imgs_set_jpg/voie_lactée-tomas-anunziata-623219.jpg, 3648, 5472 +datasets_test/high_def_imgs_set_jpg/papillon-jenish-harry-4221134.jpg, 4000, 6000 +datasets_test/high_def_imgs_set_jpg/mont_fuji-tomáš-malík-3408354.jpg, 5919, 3946 +datasets_test/high_def_imgs_set_jpg/voie_lactée2-clement-percheron-5243591.jpg, 4160, 6240 +datasets_test/high_def_imgs_set_jpg/feu-bbailey-5915315.jpg, 4992, 3328 +datasets_test/high_def_imgs_set_jpg/tour_effeil-flo-dahm-699466.jpg, 3024, 4032 +datasets_test/high_def_imgs_set_jpg/japanese_bridge_ryutaro_tsukata.jpg, 3648, 5472 +datasets_test/high_def_imgs_set_jpg/photo_of_food_ea_ehn.jpg, 2432, 1824 +datasets_test/high_def_imgs_set_jpg/sapin-skyler-ewing-4597917.jpg, 4786, 7179 +datasets_test/high_def_imgs_set_jpg/montagnes-marek-piwnicki-12214829.jpg, 3846, 2404 +datasets_test/high_def_imgs_set_jpg/person/woman_playing_tennis_mo_saeed.jpg, 3072, 4608 +datasets_test/high_def_imgs_set_jpg/person/father_feading_book_to_son_sasha_kim.jpeg.jpg, 3925, 6000 +datasets_test/high_def_imgs_set_jpg/person/person_with_lot_of_colors_brandan_saviour.jpg, 5304, 6630 +datasets_test/high_def_imgs_set_jpg/person/serious_girl_of_pc_gustavo_fring.jpg, 5760, 3840 +datasets_test/high_def_imgs_set_jpg/person/woman_stylised_africain_jackson_david.jpg, 4000, 6000 +datasets_test/high_def_imgs_set_jpg/person/portrait_of_a_man_nishit_dey.jpg, 2848, 3989 +datasets_test/high_def_imgs_set_jpg/person/person_smiling_with_a_coffee_ketut_subiyanto.jpg, 2059, 3088 +datasets_test/high_def_imgs_set_jpg/person/man_on_the_beach_juan_gomez.jpeg.jpg, 3648, 5472 +datasets_test/high_def_imgs_set_jpg/person/couple_on_the_beach_trần_long.jpg, 5304, 7952 +datasets_test/high_def_imgs_set_jpg/person/person_on_a_desk_ron_lach.jpg, 3230, 4845 +datasets_test/high_def_imgs_set_jpg/person/woman_smiling_with_eyeglasses_outdoor_matthias_cooper.jpg, 3888, 2592 +datasets_test/high_def_imgs_set_jpg/person/woman_purple_lipstic_reafon_gates.jpg, 3267, 4084 +datasets_test/high_def_imgs_set_jpg/person/perso_neutralface_alan_garzón.jpg, 4000, 6000 +datasets_test/high_def_imgs_set_jpg/person/woman_and_parcels_tima_miroshnichenko.jpg, 3685, 5528 +datasets_test/high_def_imgs_set_jpg/person/woman_swimming_patrick_case.jpg, 3648, 5472 +datasets_test/high_def_imgs_set_jpg/person/person_with_bicycle_and_empacted_food_mike_jones.jpg, 4000, 6000 +datasets_test/high_def_imgs_set_jpg/person/woman_beside_trees_shohib_tri.jpg, 4000, 6000 +datasets_test/low_def_imgs_set_jpg/5.2.08.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/4.1.03.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/4.2.05.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/5.1.13.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/5.3.01.jpg, 1024, 1024 +datasets_test/low_def_imgs_set_jpg/7.2.01.jpg, 1024, 1024 +datasets_test/low_def_imgs_set_jpg/4.1.06.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/4.2.06.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/4.2.01.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/5.3.02.jpg, 1024, 1024 +datasets_test/low_def_imgs_set_jpg/4.1.08.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/gray21.512.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/4.1.02.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/7.1.07.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/5.1.10.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/4.1.07.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/ruler.512.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/7.1.01.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/5.1.09.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/7.1.05.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/7.1.04.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/7.1.06.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/house.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/4.2.07.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/7.1.10.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/5.2.10.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/5.1.11.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/7.1.03.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/4.1.01.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/boat.512.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/4.1.04.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/4.2.03.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/5.2.09.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/7.1.02.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/7.1.09.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/4.1.05.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/5.1.12.jpg, 256, 256 +datasets_test/low_def_imgs_set_jpg/7.1.08.jpg, 512, 512 +datasets_test/low_def_imgs_set_jpg/5.1.14.jpg, 256, 256 +datasets_test/png_random/computer-icons-space-shuttle-font-keer-imgbin.png, 1600, 1600 +datasets_test/png_random/acetyl_choline_deficiencies_in_Myasthenia_gravis_wikipedia.png, 1140, 1023 +datasets_test/png_random/donuts_sticker_pngwing.png, 800, 800 +datasets_test/png_random/statue_of_liberty_pngwing.png, 800, 800 +datasets_test/png_random/fox_random_pngegg.png, 800, 800 +datasets_test/png_random/wallapaper_megumin_4chan.png, 2880, 1620 +datasets_test/png_random/nasa_space_schema_pngwing.png, 885, 524 +datasets_test/png_random/donuts_emoji_pngwing.png, 512, 512 +datasets_test/png_random/fox_screaming_pngwing.png, 512, 512 +datasets_test/png_random/electabuzz_4chan.png, 475, 475 +datasets_test/png_random/screenshot_firefox_c_quirks_fr_ache_one.png, 2236, 27730 +datasets_test/png_random/anime-female-manga-imgbin.png, 642, 900 +datasets_test/png_random/pizza_sticker_pngwing.png, 498, 600 +datasets_test/png_random/wallapaper_lwa_4chan.png, 3840, 2160 +datasets_test/png_random/francophonie_map_4chan.png, 1920, 1058 +datasets_test/png_random/wallpaper_girl_face_anime_4chan.png, 2560, 1440 +datasets_test/png_random/coffe_cup_energy_pngwing.png, 512, 512 +datasets_test/png_random/gyarados_4chan.png, 475, 475 +datasets_test/png_random/mister_avocado_pngwing.png, 512, 512 +datasets_test/png_random/lion_baby_pngwing.png, 1600, 1534 +datasets_test/png_random/map_of_japan_wikipedia.png, 2322, 2107 +datasets_test/png_random/Corsica_geographic_map-fr.png, 2200, 4030 +datasets_test/png_random/wallpaper_peter_pokememon_4chan.png, 2000, 1667 +datasets_test/png_random/cat_peach_pngwing.png, 512, 512 +datasets_test/png_random/pastafarism_monster_pngwing.png, 512, 512 +datasets_test/png_random/pearl-pony-gemstone-amethyst-garnet-pedrochabrocha-imgbin.png, 5014, 5495 +datasets_test/png_random/man_costume_pngegg.png, 1259, 2400 +datasets_test/png_random/wallpaper_girl_profile_anime_4chan.png, 1680, 1050 +datasets_test/png_random/bad_mood_girl_pngwing.png, 512, 512 +datasets_test/png_random/cat_conputer_pngwing.png, 682, 544 +datasets_test/png_random/eiffel_tower_pngwing.png, 2244, 5398 +datasets_test/png_random/screenshot_firefox_wikipedia.png, 2236, 1389 +datasets_test/png_random/eiffel_tower_2_pngwing.png, 563, 798 +datasets_test/png_random/elsword-april-fools-day-player-versus-player-maid-el-lady-imgbin.png, 500, 650 +datasets_test/png_random/cat_donus_pixel_art_pngwing.png, 656, 476 +datasets_test/png_random/screenshot_ache.png, 2256, 1504 +datasets_test/png_random/wallpaper_archlinux_4chan.png, 3840, 2160 +datasets_test/png_random/China_social_credit_system.png, 1754, 2481 diff --git a/articles/res/support_avif.avif b/articles/res/support_avif.avif new file mode 100644 index 0000000..61de561 Binary files /dev/null and b/articles/res/support_avif.avif differ diff --git a/articles/res/support_avif.png b/articles/res/support_avif.png new file mode 100644 index 0000000..a485512 Binary files /dev/null and b/articles/res/support_avif.png differ diff --git a/articles/res/support_jxl.avif b/articles/res/support_jxl.avif new file mode 100644 index 0000000..6081ef6 Binary files /dev/null and b/articles/res/support_jxl.avif differ diff --git a/articles/res/support_jxl.png b/articles/res/support_jxl.png new file mode 100644 index 0000000..f8853b2 Binary files /dev/null and b/articles/res/support_jxl.png differ diff --git a/articles/res/support_webp.avif b/articles/res/support_webp.avif new file mode 100644 index 0000000..ec95cb4 Binary files /dev/null and b/articles/res/support_webp.avif differ diff --git a/articles/res/support_webp.png b/articles/res/support_webp.png new file mode 100644 index 0000000..57c797d Binary files /dev/null and b/articles/res/support_webp.png differ diff --git a/articles/res/webp_support.avif b/articles/res/webp_support.avif new file mode 100644 index 0000000..16aa7f2 Binary files /dev/null and b/articles/res/webp_support.avif differ diff --git a/articles/res/webp_support.png b/articles/res/webp_support.png new file mode 100644 index 0000000..04375b5 Binary files /dev/null and b/articles/res/webp_support.png differ diff --git a/articles/web-image-formats.md b/articles/web-image-formats.md new file mode 100644 index 0000000..cbe6d1d --- /dev/null +++ b/articles/web-image-formats.md @@ -0,0 +1,563 @@ +--- + +pubDate = 2023-08-11 +tags = ['web', 'image', 'programmation'] + +[author] +name = "ache" +email = "ache@ache.one" + +[[alt_lang]] +lang = "fr" +url = "/articles/formats-images-web" + +--- + + + + +Study of modern image formats +========================== + +![SVG image of a modern computer](/s/imgM/computer.svg) +What's the state of modern image formats and which one should I choose on the web now ? +In this article, let's study modern image formats (AVIF, HEIF, WebP, WebP2 et JPEG XL) as precisly as possible. 🖼️ + +First, I'll explain how I studied these image formats. +Then I'll compare the encoders performances, graph them and analyse them. +Finally, on the basis of the data analysis, I'll compare the image formats and their use cases. + +:::note +This article is going to be long and technical. Feel free to go straight to the analysis section, or even the conclusion. +::: + +Table of contents +-------- + +Study protocol +---------------- + + +I've put together a set of free of use images found on the web. +This dataset is made up of images of very varied dimensions, sizes, origins and uses. +In total, 169 images from 6 different datasets were analysed. + +Each encoder converts the images by varying the speed (sometimes called effort) and quality options for each image. +So for **each image**, 308 images were produced. + +Since the formats studied all use lossy compression, it is necessary to estimate the quality lost during the encoding process. +Each image produced was decoded into PNG format. +This was used to calculate the structural similarity in order to estimate the loss of quality induced by the encoder. [^DSSIM] + +[^DSSIM]: [The implementation (in Rust) used](https://kornel.ski/dssim) is made by [Kornel](https://mastodon.social/@kornel), whom I thank. + +For each image, the data collected from this process is as follows: + + + - [x] If the encoding process was successful (encoder return code equal to 0). + - [x] The name of the image and its dataset. + - [x] The encoder format and the quality and effort parameters (compression speeds) used by the encoder. + - [x] The size of the source image and the target image in order to calculate the compression ratio. + - [x] The time taken to encode and decode the target image. + - [x] The structural similarity measure[^dis]. + - [x] The date on which the image was generated. + +[^dis]: Technically, a dissimilarity calculation. Here, we are looking for structural similarities between two images using the [SSIM] algorithm (https://fr.wikipedia.org/wiki/Structural_Similarity). +This is one of the methods for estimating the difference in perception between two images. + +This is one of the methods for estimating the difference in perception between two images. + + +#### Expected results + +I expect WebP to underperform the other formats on all counts. +Also, AVIF should perform less well than WebP2. +If the withdrawal of support for JPEG XL in Chrome and Firefox is anything to go by, I expect JPEG XL to perform less well than WebP2 and offer little in comparison with AVIF. + + +### Dataset + +I compiled this dataset myself. +I don't own the rights to the images, but I chose royalty-free images whenever possible. +I have favoured variety over freedom of use. +A completely free dataset could have been put together, but it would have taken a lot more time. +Although I find this ridiculous, technically I own the rights to the dataset. +You are therefore free to reuse and modify it as long as you respect the original licences for the images. + +You can download it from this [torrent file](res/datasets_test_imgs_ache.torrent) or this [magnet link 🧲](magnet:?xt=urn:btih:3217ff465d9c13cdbb2f7b1d776ee0f2a152ba54&dn=datasets_test_imgs_ache&tr=udp://tracker.opentrackr.org:1337/announce&tr=https://tracker1.520.jp/announce&tr=udp://tracker.torrent.eu.org:451/announce&tr=http://bt.endpot.com/announce). + +Dataset source | Format | Number of images | Description | License +---------------|----------------|-----------------|-------------|-------------------- +low_def_imgs_set_jpg | jpg | 39 | Subset of the [USC-SIPI dataset](https://sipi.usc.edu/database/).[^USC-SIPI] | Complex but [accepted that they can be used for research](https://sipi.usc.edu/database/copyright.php) +png_random | png | 38 | A variety of PNG images from a few hours' experience on the internet. A mix of "free for personal use", CC and certainly shared with a restrictive licence. +photos_imgs_set_jpg | jpg | 16 | Personal holiday and travel photos. | I own the rights and authorise use the CC-BY 2.0 ache licence. +high_def_imgs_set_jpg | jpg | 28 | Professional-quality, royalty-free images from the Pexels website. The attribution of each image is given in the name of the photo. | [Free to use](https://www.pexels.com/license/) +selected_holliday _photos_jpg | jpg | 24 | Subset of the [INRIA dataset](https://lear.inrialpes.fr/~jegou/data.php#holidays). | Property of INRIA[^source_inria]. Use conditional on quoting the paper from which it is taken. +xkcd | png | 24 | Subset of a panel from the online comic strip XKCD. | [CC-BY-NC](https://xkcd.com/license.html) + +[^USC-SIPI]: Low-resolution images, mainly from the *misc* category. +[^source_inria]: From the paper "Hamming Embedding and Weak geometry consistency for large scale image search", presented at the 10ᵉ European Computer Vision Conference in October 2008. + + +### Encoders + +I used a specific version of the encoders, the most recent available. +This improves the reproducibility of the experiment. + + +Format | Transparency support | Quality interval | Effort interval | Encoder / Decoder | Version +-----|---|-------|---------------------|-----------------------|------ +AVIF | ✔️ | 0-100 | Option unavailable | heic-enc / heic-convert | 1.15.2 +HEIF | ✔️ | 0-100 | Option unavailable | heic-enc / heic-convert | 1.15.2 +JXL | ✔️ | 0-100 | 1-9[^zap] | cjxl / djxl | v0.8.1 (c27d4992) +WebP | ✔️ | 0-100 | 0-7 | cwebp / dwebp | 1.3.0 (libsharpyuv: 0.2.0) +WebP2 | ✔️ | 0-100 | 0-10 | cwp2 / dwp2 | 0.0.1 (b80553d) + +[^zap]: Chaque niveau d'effort possède une représentation textuelle et je trouve ça très drôle. + + Niveau | Textuelle + --|--- + 1 | lightning + 2 | thinder + 3 | falcon + 4 | cheetah + 5 | hare + 6 | wombat + 7 | squirrel + 8 | kitten + 9 | Tortoise + + +It should be noted that not all formats and encoders offer the same functionality. +AVIF and WeBP2, for example, do not offer progressive decoding. +However, I have never activated this option in the cjxl encoder. + +Where possible, I activated parallel calculation, i.e. with WebP and WebP2. +For WebP2 I limited the number of threads to 8, whereas WebP did not offer this option. + +Similarly, the parameters between encoders are not comparable! ⚠️ +So `50` quality for AVIF **does not correspond** to `50` quality for WebP2. + +:::note +One mistake I made was to include the 100 quality of JPEG XL, which automatically activates its lossless compression mode, whereas the other encoders need an option for this. +::: + + +#### Browser supports + + +By august 2023, at the time of writing: + + - WebP has the best support + - AVIF also has very good support, but Edge and certain other more confidential browsers are reluctant to support it. + - JXL is only supported by Safari, but support has existed on an experimental basis in Chrome and Firefox. + It has now been withdrawn from Chromium. + For Firefox, it is only present in _nightly_ by activating the `image.jxl.enabled` option. + - HEIF is supported only on recent version of Safari. + - WebP2 has no support of any sort. + +WebP support by web browsers + +
+ +AVIF support by web browsers + +
+ +JPEG XL support by web browsers + +Support for the various formats currently available on the [canisuse.com](https://caniuse.com/) website. + +#### Features + +Format | Animation | HDR | Progressive decoding | Maximum number of channels | Maximum dimensions +-------|-----------|-----|---------------------|---------------------------|-------------------- +WebP | ✔️ | ✖️ | ✖️ | 4 | 16 383 x 16 383 | +AVIF | ✔️ | 10bits | ✖️ | 5 | 8193x4320 | +JXL | ✔️ | 12bits | ✔️ | 5 | 1 703 741 823 x 1 703 741 823 | +WebP2 | ✔️ | 10bits | 🤷 | 4099 | 16 383 x 16 383 | + +AVIF supports arbitrary dimensions, but in this case the image is split into 8193x4320 blocks. +No consistency is ensured at the link between these blocks, which can cause artefacts. + +Is this synonymous with progressive decoding? It certainly does. +Is it already implemented? I don't know. + +Analysis of produced images +---------------------------- + +We will first analyse the errors and then the performance of each encoder. + + +### Encoding errors 🐛 🐞 + +There are two types of error: + + 1. When the encoding process crashes or fails, returning an error code other than 0. + 1. When, at the end of the encoding process, the generated image is particularly different from the source image. + I will arbitrarily set a threshold of `0.4` for similarity[^dis], so any image with a higher DSSIM threshold will be considered to be in error. + + +#### heic-enc to encode AVIF and HEIF + +The heic-encoder has a problem managing EXIF data, and the image is not returned correctly. + +As a result, the calculation of structural similarity could not work, as the original and produced images do not have the same dimensions. +This error affects the AVIF and HEIF formats. +In order to deal with this case, the EXIF data has been removed from all the images. +This should not affect the size of the image produced. +As this error has been circumvented, it has not been counted as an error. + +Also on some PNGs the image produced was particularly different from the source image. + +This seems to be a problem in decoding the source image, since both formats are affected. +In addition, the image produced was recognisable but badly damaged. +9 source images were affected, and the error was systematic for each image produced from these source images. + + +#### cjxl encoder + +The jxl encoder is still successful but the decoding step has failed 3 times. + +This suggests that **jxl has not produced a valid image**. +In a way, this is the worst possible bug. +Testing with [another JPEG XL decoder implementation](https://github.com/tirr-c/jxl-oxide), we get a more explicit "Unexpected end of file" error. + +There were also 3 images generated that are particularly different from the source image. + +However, unlike the heic-encoder, this error only occurs when images are encoded with a quality of 100 and a level 1 effort, called lightning ⚡. +The 3 images affected by this bug are unrecognisable but curiously, the set of colours used is recognisable. +It should be noted that these 3 images were also images that were not faithfully represented by heic-enc. +It's unlikely to be a coincidence, but it's possible. + + + +#### cwebp and cwp2 encoders + +The WebP encoder fails on 6 images and the WebP2 encoder fails on 1 image. + +The WebP2 encoding error is clear: `WP2_STATUS_BAD_DIMENSION`. +In fact, the image in question is particularly large. +This is the only error. + +The WebP encoder fails on the same image, for the same reason, but also on 5 other images. +In these cases the error returned is : + +~~~ +Saving file 'test_crash.webp' +Error! Cannot encode picture as WebP +Error code: 6 (PARTITION0_OVERFLOW: Partition #0 is too big to fit 512k. +To reduce the size of this partition, try using less segments with the -segments option, and eventually reduce the number of header bits using -partition_limit. More details are available in the manual (`man cwebp`) +~~~ + +Given that the error only occurs with quality at 90 or 100 and effort at 0 or 1 simultaneously, I consider this to be a borderline case that the encoder has difficulty handling. +I didn't investigate further. + +I note that, for these two encoders, there is no error of too low similarity between the image produced and the source image. +This is a very good thing. 👌 + + +#### Conclusion of the study of errors + +Only the JPEG XL format fails to encode images and produces glitches. +The PNG image decoding part of `heic-enc` needs to be improved, as it has **very many bugs** which also produce glitches. +The WebP and WebP2 formats have problems with the limited dimensions supported by the format. +WebP has a bug in its official implementation in certain limited cases. + + +From this point, we will exclude cases with errors from our statistics. +As a result, AVIF and HEIF will have 9 fewer images. +JPEG XL, WebP and WebP2 will have no data corresponding to certain parameters. + +The bugs encountered by JPEG XL have now been resolved but the fix is not yet available in the latest version released. +I warned about the [heif-encoding bug](https://github.com/strukturag/libheif/issues/937) and was fixed promptly. +I didn't do the same for WebP, as the process requires a Google account. + + +### Compression rate compared to the quality of the image produced + +For ease of comparison, I'm going to *comparison by dataset*. +It turns out that many images in the same dataset follow the same trends. +So I'm going to try and list the different trends. + + +#### Low definition images + +Within the `low_def_imgs_set_jpg` dataset there are 3 trends. +A small set of images where the AVIF and HEIF formats do particularly badly, 3 images where the variation in performance is very large and the rest where all the image formats have roughly equivalent performance. + +In around 13 cases, the AVIF and HEIC formats performed less well than all the others. +The maximum similarity achieved is far from 0. +Looking at the images, it does not seem that the images concerned have anything in common. + +This poor performance can be explained either by a decoding problem or by the fact that the algorithms are not effective on these images. + +On 3 images, it's clear that the results are very varied. The performance of each format depends very much on the effort and quality configured. +Despite the wide variations, there is a clear segmentation where WebP2 clearly outperforms its competitors. +AVIF and HEIC are OK, but JPEG XL lags behind WebP. + +The images concerned are clearly greyscale test images. + +Finally, for the rest of the low-resolution images, the performance of all the image formats is more or less identical. +Only WebP lags slightly behind. + + +#### Random PNGs + +Here, it is not easy to define a trend. +Generally speaking, AVIF is equivalent to WebP2 and both do better than JPEG XL. +WebP is generally pretty bad, but it's not uncommon for it to equal JXL in performance. +But this is only shown as clearly as in some graphs. + +General trend in PNGs, compression ratio as a function of quality for different image formats + +However, the slight dominance of AVIF over HEIF is clear in this data set. +Also, on a fairly large number of images, the AVIF and HEIF formats manage to reduce the size of the image by reducing its quality, whereas the other algorithms reach a threshold (each with a different threshold) that they are unable to exceed. + + +Some images (👽) have a very unusual graph! + +Plot of quality as a function of size for different formats of the cat_donus_pixel_art image + + +This is the case with `cat_donus_pixel_art` where JPEG XL is very good at 100 quality (lossless) but does slightly less well than WebP otherwise. WebP also gives very good results, whereas WebP2 has difficulty optimising image size. AVIF gives very poor results, while HEIF systematically increases image size (except at quality 0). + +Also on large, highly detailed images, JPEG XL can become interesting. +This is the case, for example, on the screenshot image of the home page of where JPEG XL becomes as interesting as WebP2, itself better than AVIF. +JPEG XL performs better on large images (in size) such as `eiffel_tower_pngwing`, `screenshot_firefox_c_quirks_en_ache_one`. + +Graph of quality as a function of size for different formats for a Wikipedia screenshot. + + +#### Personal holiday photos + +The trend is very clear in this dataset. +All formats except WebP are excellent. + +General trend in personal photos, compression ratio as a function of quality for different image formats + +Note the mediocre performance of WebP2 when the quality is 100%. +Almost ✕ 6 on the `nantes_église` image and almost ✕ 5 on `sleeping_bridge_beauty`. +AVIF suffers from the same problem on 100 and 90 quality but not to such an extent. +JPEG XL **never** encounters this problem. + +#### High definition images + + +The trend is identifiable. +All formats except WebP are excellent. +We can even rank JPEG XL first, AVIF/HEIF second and WebP2 third. +It should be noted that this ranking is not true for all images. +Also, all three formats have very good results, so the difference between WebP2 and JPEG XL is not that noticeable. + +General trend towards high-resolution photos, compression ratio as a function of quality for different image formats + +Broadly the same trend as the personal holiday photo dataset. +The performance achieved is on average better, however. + +No image stands out from the crowd, except for WebP2 performance at 100% quality and effort 0. +An initial size multiplied by 8.5! + + +#### Photos of the INRIA dataset + +Same analysis than the two previous datasets. 🤷 + +General trend for photos in the INRIA dataset, compression ratio as a function of quality for different image formats + + +#### PNG images from XKCD website + + +Very poor results for JPEG XL, worse overall than WebP, except on one image, where it excels in lossless mode. (`1416.jpg`). +WebP2 does well. +AVIF/HEIF is also quite equivalent. +There are two trends. + + +General trend in PNGs from XKCD, compression ratio as a function of quality for different image formats + +The first, and most common, is the dominance of WebP2 and AVIF/HEIF (equivalent) over the other formats. +However, WebP2 performs better on certain images (136, 209, 399, 695, 731, 1071). +What these images have in common is that they have colours, often a lot of colours. +But there are some colour images where the performance gain is not significant. + +The second, which can be seen in images 1123, 1144 and to a lesser extent 376, 1163, 1195 and 1445, is that JXL is better than the others when the quality is good and WebP is better than the others when the quality is poor. +This trend was difficult to predict. +What these images have in common is their small size. + +Trend in PNGs from XKCD, where WebP and JXL alternately dominate the other formats, compression ratio as a function of quality for the different image formats + +One exception is image 1416, which caused the `heic-enc` encoder to bug. + - It was very hard to compress for the various encoders. + - WebP does not have a single image smaller than the original. + - JXL needs a quality of 100 to produce images smaller than the original. + - WebP2 has very good results at 100 quality, otherwise it doesn't achieve much, even if it sometimes manages to make the image lighter than the original. + + +### Overall encoder speed + +For the same quality, the encoders take very different times. +Here, taking the AVIF format points as a basis and comparing them with the similarity and similar ratio points, we obtain this graph: + +:::attention +The scale is logarithmic in order to display all the data on the graph. +::: + +Encoders encoding time + +WebP is the fastest format overall. +Next come AVIF and HEIF, but JPEG XL is very close. It is even faster on average. +The anomaly here is WebP2, which is much slower overall (note that the scale is logarithmic ...) + +AVIF and HEIF are the most consistent, being the only encoders to encode all images in less than 10s. +JPEG XL took up to 2 minutes to encode certain images, while WebP2 sometimes took 2 hours to encode an image! + + +### Study of decoding time + +I looked at the decoding times for the different formats, but **they're all pretty much the same**. +All images are decoded in 10s maximum by all image formats. + +:::note +This result is quite surprising. +It would not be surprising if an error made it way in these measurements and if, for example, it was the time taken to write to disk that was measured here. + +The most likely scenario is that the PNG encoding time is of a higher order than the decoding time for the various formats. +::: + +A slight tendency for JPEG XL to be slower than AVIF and WebP2 to be faster than AVIF. + + +Median decoding time by decoder. + +Mean decoding time by decoder. + + +:::information +Here, I have not enabled progressive decoding of JPEG XL. +It would have been interesting to see whether progressive decoding of JPEG XL would have resulted in a faster display. +::: + + +### A look back at the study 👀 + +I think this study can be improved. +I plan to repeat this comparison in July 2024 and would like to list the points for improvement. + +1. Improve reproducibility with a Docker image. + +2. Compare equal BPP (time/quality) and equal quality (BPP and time). + This is particularly complicated, but it can be done. + +3. Study more encoders. + Here, I have made the amalgam encoder ≈ format, but it is true that the quality of the encoder plays a particular role in the representation of a format. + +4. Use several image quality metrics. + +5. Include the [BPG (Better Portable Graphic)](https://bellard.org/bpg/) format for comparison. + +1. I wanted to compare only lossy image encodings. Except that JPEG XL at quality 100 is automatically a lossless format. ❌ + Next time I'd like to include the lossless versions of the different encoders. + +6. Check the validity of the decoding times. + + +Conclusion +---------- + +Note that in all cases AVIF, WebP2 and JPEG XL are generally more interesting than JPEG or PNG. + +Taking into account current browser support (August 2023). +Only use AVIF if Edge (or QQ Browser) is not essential for you. +If you can, use the [picture] tag (https://developer.mozilla.org/fr/docs/Web/HTML/Element/picture) to prepare for future image formats. +You can then offer AVIF to those who support it, otherwise use WebP[^png]. + +[^png]: Or PNG if you need to support very old browsers. + +Taking into account only the qualities and shortcomings of the various encoders, for example for storage purposes, or in the future when these formats are supported by the browser. + +**JPEG XL** should be used for all **photographs**. +For PNGs, it is difficult to choose between AVIF and WebP2 in the general case, choose WebP2 with an effort of 6 and a quality of 90 or AVIF with a quality between 80 and 90. +If you process your images manually, test AVIF and WebP2 and see which one best matches your data. +If you do **automatic processing**, preferably use **WebP2**, but bear in mind that AVIF is also a very good candidate, especially if you are constrained by encoding time or CPU load or if you have images of arbitrarily large dimensions. + +So what I'm observing contradicts other studies on the subject. +This may be due to the encoders progress. +In fact, libjxl and libheif are in active development while [libwp2](https://chromium.googlesource.com/codecs/libwebp2/) is in pause. +Despite the encoder's maturity, it seems that [WebP2 will not go beyond the experimental stage](https://chromium.googlesource.com/codecs/libwebp2/+/1251ca748c17278961c0d0059b744595b35a4943%5E%21/). + +:::details +Additional Resources + + - The [torrent file](res/datasets_test_imgs_ache.torrent) ([magnet link 🧲](magnet:?xt=urn:btih:3217ff465d9c13cdbb2f7b1d776ee0f2a152ba54&dn=datasets_test_imgs_ache&tr=udp://tracker.opentrackr.org:1337/announce&tr=https://tracker1.520.jp/announce&tr=udp://tracker.torrent.eu.org:451/announce&tr=http://bt.endpot.com/announce)). + - The [raw data](res/raw_data_images_format_2023.csv). + +::: + + + + + diff --git a/src/build/i18n.mjs b/src/build/i18n.mjs index b8d01f0..dfc7c59 100644 --- a/src/build/i18n.mjs +++ b/src/build/i18n.mjs @@ -13,6 +13,7 @@ const i18n = { 'mastodon': 'Mon mastodon', }, articles: [ + 'formats-images-web.md', 'bizarreries-du-langage-c.md', 'retour-sur-laoc-2021-semaine-1.md', '2FA-discord-sur-pc.md', @@ -41,6 +42,7 @@ const i18n = { 'mastodon': 'Mastodon account', }, articles: [ + 'web-image-formats.md', 'c-language-quirks.md', ], rss: { diff --git a/src/img/ic_note_black_48px.svg b/src/img/ic_note_black_48px.svg new file mode 100644 index 0000000..a96b381 --- /dev/null +++ b/src/img/ic_note_black_48px.svg @@ -0,0 +1,4 @@ + + + + -- cgit v1.2.3