Mesuré, pas promis

Performances

Chaque chiffre de cette page vient de vraies photos sur un portable ordinaire (Apple M3, 16 Go), et les scripts qui les ont produits sont dans le dépôt, donc chacun peut les relancer. Sous chaque graphique, ce que cela veut dire pour vos tirages, et à la fin, les mots derrière les chiffres.

Pourquoi Fotollection est rapide

Pas de magie. Quelques décisions prises avant la première ligne de code, chacune mesurée.

  1. Du code natif sur chaque cœur

    Le travail de Fotollection tourne en Rust, compilé pour votre processeur et réparti sur tous ses cœurs, avec les instructions vectorielles (SIMD) que les processeurs offrent pour les pixels.1,2,3

    23,5 / sphotos de 16 MP exportées

  2. Seulement le nécessaire

    Ouvrir un dossier lit l’EXIF de chaque fichier et sa petite vignette intégrée, jamais la photo entière. Les vignettes sont gardées dans un cache sur disque.4

    0,12 spour ouvrir 1 000 photos

  3. Jamais plus de pixels que l’écran

    Un aperçu fait au plus 1 600 px, tiré d’une copie de 2 048 px gardée en mémoire. La photo entière n’est lue que quand vous zoomez, une partie à la fois.

    17 mspour redessiner un aperçu

  4. Prêt avant que vous cliquiez

    Une fois les vignettes faites, un aperçu de chaque photo est préparé en arrière-plan et gardé sur disque, pendant qu’un quart de la mémoire garde les photos autour de celle à l’écran.

    27 mspour ouvrir n’importe quelle photo

  5. Rien de fait deux fois

    Un curseur de couleur ne change que la couleur, jamais la taille. Tous les curseurs de couleur sont réunis dans une seule table de 33 × 33 × 33 couleurs, donc dix curseurs coûtent autant qu’un seul.

    2 mspour dix curseurs de couleur sur un aperçu

  6. La mémoire dans le budget

    Fotollection ne travaille que sur autant de photos en taille réelle à la fois que son budget mémoire le permet, fixé par la plus grande photo de l’export.

    1,45 Gopic de mémoire avec 5 035 photos

  7. Des encodeurs réglés par la mesure

    Les fichiers pour le tirage sautent une optimisation de table qui les rendait moins de 1 % plus petits et coûtait un tiers du temps d’encodage.

    −33 %de temps d’encodage pour les fichiers de tirage

  8. La carte graphique pendant la retouche

    Pendant qu’un curseur de couleur bouge, la carte graphique dessine à partir de la table que construit le cœur. Les exports restent sur le processeur, donc un tirage est identique sur chaque ordinateur.

    1–2 mspar pas de curseur, contre 26 ms avant

Où se fait le travail : Fotollection sur votre ordinateur, face à un éditeur web courant
Où se fait le travail : Fotollection sur votre ordinateur, face à un éditeur web courant

Jusqu’à 20× plus rapide. Une nouvelle façon d’utiliser la mémoire.

La v0.11.0 repense la façon dont Fotollection garde vos photos. L’aperçu de chaque photo est préparé en arrière-plan dès que sa vignette est faite et gardé sur disque, un quart de la mémoire de votre ordinateur garde les photos autour de celle que vous voyez, et la photo à l’écran passe toujours en premier. Résultat : n’importe quelle photo, proche ou lointaine, JPEG ou RAW, s’ouvre en 27 millisecondes. Ouvrir un RAW est jusqu’à 20 fois plus rapide qu’avec la v0.9.0, un JPEG 10 fois plus, mesuré sur les mêmes 422 photos d’un voyage.5,6

20×plus rapide pour ouvrir une photo RAW qu’avec la v0.9.0 (531 → 27 ms)
10×plus rapide pour ouvrir un JPEG qu’avec la v0.9.0 (274 → 27 ms)
27 mspour ouvrir n’importe quelle photo, proche ou lointaine (budget 100 ms)
Ouvrir une photo : v0.9.0 et v0.10.0 face à v0.11.0, sur les 422 photos d’un voyage
Ouvrir une photo : v0.9.0 et v0.10.0 face à v0.11.0, sur les 422 photos d’un voyage7
D’où vient l’aperçu d’une photo : la mémoire, puis le disque, puis le fichier
D’où vient l’aperçu d’une photo : la mémoire, puis le disque, puis le fichier

Avant : chaque photo décodée au clic

Jusqu’à la v0.10.0, un aperçu était fait quand vous le demandiez : le fichier lu, la photo décodée (un RAW développé), remise droite, ramenée à 2 048 px et convertie en sRGB, puis recadrée, colorée, datée et encodée pour l’écran. Sur une photo de 20 MP d’un Lumix GX9, cela prenait 274 à 278 ms pour un JPEG et 440 à 531 ms pour un RAW, chaque fois qu’on ouvrait une photo qui ne faisait pas partie des huit dernières. Assez rapide pour une photo ; pas pour parcourir un voyage.

Des aperçus standard, comme Lightroom les garde

Depuis la v0.11.0, le travail que l’utilisateur attend est fait avant qu’il le demande. Une fois les vignettes d’un dossier prêtes, Fotollection fait en arrière-plan la copie de 2 048 px de chaque photo, une photo à la fois par fil, et la garde sur le disque à côté des vignettes, en JPEG d’environ 0,66 Mo (environ 280 Mo pour tout le voyage). Un clic sur n’importe quelle photo, proche ou lointaine, dans cette séance ou la suivante, part de cette copie : 27 ms pour un JPEG comme pour un RAW. Il reste le travail propre à l’aperçu (recadrage, redimensionnement, couleur, date incrustée et encodage), les mêmes 27 ms que depuis la mémoire. Un aperçu fait à partir de la copie sur disque diffère d’un aperçu neuf de 1,35 niveau sur 255 en moyenne, trop peu pour se voir.8

La mémoire bien utilisée, pas le moins possible

Une visionneuse qui garde huit photos en mémoire sur un portable de 16 Go gaspille le portable. Fotollection donne désormais à l’aperçu un quart de la mémoire de la machine (sur un Mac de 16 Go, environ 190 photos à 2 048 px, 20 développements RAW gardés pour leurs curseurs et 600 Mo pour le zoom), comptés en octets et libérés du plus ancien au plus récent. Quand une photo est à l’écran, les deux suivantes dans le sens où vous avancez et celle de derrière sont chargées aussi, si bien que les touches fléchées n’attendent jamais. Le plafond de 2 Go tient toujours pour les exports.

La photo à l’écran passe en premier

Un seul RAW est développé à la fois, pour qu’une série de photos RAW tienne en mémoire. Avant, l’ordre de la file était une question de chance : un aperçu en préparation, l’estimation de taille de l’export ou un export pouvaient faire attendre la photo sur laquelle vous aviez cliqué. Désormais, chaque développement dit qui l’attend, et le travail en arrière-plan s’efface dès que la photo à l’écran en a besoin. Ce même travail a aussi révélé deux blocages rares, disparus depuis : l’un où chaque fil attendait un développement qui n’avait plus aucun fil pour tourner, l’autre où l’écran attendait une image qu’il n’avait jamais demandée.

Version JPEG p50 / p95 RAW p50 / p95 Comment
v0.9.0 274 / 286 ms 531 / 550 ms Décodé au clic ; RAW via macOS
v0.10.0 278 / 293 ms 440 / 471 ms Décodé au clic ; RAW via notre propre développement
v0.11.0 27 / 32 ms 27 / 30 ms Depuis l’aperçu standard sur disque, ou la mémoire

Mesuré sur le voyage du propriétaire à Prague (396 JPEG et 26 RAW, 20 MP) sur un Apple M3 avec measure_browse : la v0.9.0 compilée depuis son propre tag, la v0.10.0 sur son code juste avant ce changement.

Vitesse : mille photos en un clin d’œil

Ouvrir un dossier lit l’EXIF de chaque photo et sa petite vignette intégrée, pas l’image entière, et un réglage modifié ne redessine que l’aperçu. Le Rust natif bat aussi un navigateur web qui fait la même tâche : la même vitesse d’export, un aperçu plus rapide et un quart de mémoire en moins.9

0,12 spour lire un dossier de 1 000 photos, huit fois sous le budget
17 mspour redessiner l’aperçu après un changement
23,5photos de 16 MP exportées par seconde
Vitesse et mémoire, face aux budgets fixés avant d’écrire le code
Vitesse et mémoire, face aux budgets fixés avant d’écrire le code7
La même tâche dans Fotollection et dans un navigateur web
La même tâche dans Fotollection et dans un navigateur web7

Ce qui se passe quand vous ouvrez un dossier

Un dossier de photos n’est pas lu en entier. Pour chaque fichier, Fotollection lit ses données EXIF (date, appareil, lieu) et la petite vignette que chaque appareil range dans le fichier, et rien d’autre : 1 000 photos prennent 0,12 s, pour un budget de 1 s fixé avant d’écrire le code. Des vignettes plus nettes de 400 px sont ensuite faites en arrière-plan, sur deux fils pour que Fotollection reste réactif, et gardées dans un cache sur disque, si bien qu’un dossier rouvert s’affiche instantanément. Pour 5 035 photos, l’import a pris 383 ms et les vignettes intégrées 236 ms.

Où passent les 17 ms d’un aperçu

Changer un réglage refait le rendu de l’aperçu à partir d’une copie de 2 048 px de la photo gardée en mémoire, jamais à partir du fichier complet. Sur les 16,7 ms que cela prend, le recadrage et le redimensionnement avec un filtre de Lanczos prennent 9,7 ms, la date incrustée moins de 0,1 ms, et l’encodage de l’aperçu en JPEG pour l’écran 7,0 ms. Cet encodeur a été réglé par la mesure : avec les réglages de l’export (pleine résolution de couleur et tables optimisées), il prenait 16,2 ms ; l’écran n’en a pas besoin, donc l’aperçu utilise la couleur divisée par deux et des tables simples, tandis que les exports gardent la couleur complète (4:4:4). Un filtre de redimensionnement moins coûteux a été essayé et s’est révélé plus lent sur ce processeur (12,5 ms), donc Lanczos est resté.

Code natif contre navigateur

La même tâche (décodage, recadrage en 2:3, date incrustée, JPEG en qualité 95) a été exécutée sur les mêmes 95 photos dans Fotollection et dans Chromium avec un worker par cœur. La vitesse d’export est sortie identique, 18,0 contre 17,9 photos par seconde, ce qui a démenti notre première hypothèse : un navigateur n’est pas lent. Les raisons du code natif sont ailleurs : Fotollection écrit des fichiers 4:4:4 en pleine résolution de couleur là où l’encodeur du navigateur divise la couleur par deux, il garde le profil de couleur de chaque photo, il écrit les fichiers directement sur le disque, et il a utilisé un quart de mémoire en moins (1,35 Go contre 1,78 Go). Depuis, l’encodeur d’impression a encore été accéléré : 23,5 photos par seconde à 16 MP.

La carte graphique pendant la retouche, chaque cœur pour les exports

Pendant que vous faites glisser un curseur de couleur, la carte graphique dessine le look à partir de la même table que construit le cœur de Fotollection, et le rendu exact prend le relais quand vous relâchez. Les exports restent sur le processeur, donc un tirage sort identique sur chaque ordinateur.

1–2 msun pas de curseur sur la carte graphique, contre environ 26 ms
0,13ΔE2000 entre le look de la carte et le rendu exact
10,8photos de 26 MP exportées par seconde, six à la fois
Un pas d’un curseur de couleur : le processeur face à la carte graphique
Un pas d’un curseur de couleur : le processeur face à la carte graphique7
Vitesse d’export selon le nombre de photos traitées à la fois
Vitesse d’export selon le nombre de photos traitées à la fois7
La retouche sur la carte graphique, l’export sur chaque cœur du processeur
La retouche sur la carte graphique, l’export sur chaque cœur du processeur

Dix curseurs pour le prix d’un

Chaque curseur de couleur (luminosité, contraste, chaleur, saturation, délavage, ombres et hautes lumières teintées, noir et blanc) est replié dans une seule table de 33 × 33 × 33 couleurs, 35 937 points qui disent où va chaque couleur. L’appliquer à une photo revient à trouver la case de chaque pixel dans la table et à interpoler entre quatre de ses coins (interpolation tétraédrique), si bien que dix curseurs coûtent autant qu’un seul. Construire la table avec tous les curseurs réglés prend environ 2,6 ms ; l’appliquer à un aperçu de 1 600 px, moins de 2,2 ms ; à un export de 24 MP, environ 24 ms.

Pourquoi un glissement semblait encore lent, et ce que la carte graphique a changé

Mesuré étape par étape, un mouvement de curseur coûtait environ 26 ms, dont 2 ms seulement pour la couleur elle-même : le reste allait à l’encodage de l’aperçu en JPEG (7 à 11 ms) et à son décodage par la fenêtre (9 à 15 ms). La carte graphique supprime les deux. Quand un glissement commence, l’aperçu brut et un masque de l’emplacement de la photo (sans la date incrustée, le cadre ni la bordure) partent une fois vers la carte graphique ; à chaque pas, seule la nouvelle table suit, et un petit programme WebGL2 l’interpole, exactement comme le cœur : 1 ms par pas dans le WebKit de macOS, 2 ms dans Chromium. Quand vous relâchez, le rendu exact du cœur prend le relais. Les deux ont été comparés sur un look marqué avec tous les curseurs déplacés : ils diffèrent de 0,13 en ΔE2000 en moyenne et de 0,77 au 99ᵉ centile, bien en dessous du 1 qu’un œil voit côte à côte.

Aucun interrupteur n’est nécessaire. Au premier glissement, Fotollection vérifie par lui-même : s’il n’y a pas de WebGL2, si le rendu est logiciel ou si un pas de test prend 8 ms ou plus, il garde la voie du processeur pour la séance. Un rendu logiciel a pris 16,5 ms par pas dans le test, il est donc juste de rester sur le processeur dans ce cas.

Les exports sur chaque cœur

Le décodage et l’encodage d’une photo tournent chacun sur un cœur, si bien qu’un export est rapide quand plusieurs photos sont traitées à la fois. Combien dépend de la mémoire : sur des photos de 24 à 26 MP, 2 à la fois ont donné 4,9 photos par seconde, 4 en ont donné 9,4, 6 en ont donné 11,5 et 8 en ont donné 12,5, la mémoire passant de 0,49 à 1,21 Go. Fotollection choisit le nombre d’après un budget mémoire de 1,6 Go et la taille de la plus grande photo, et s’arrête à 6, car sur les photos d’un vrai voyage, 8 à la fois n’allaient pas plus vite et utilisaient 0,2 Go de plus. Les exports n’utilisent jamais la carte graphique : un tirage doit sortir identique sur chaque ordinateur, et les tests qui comparent les exports octet par octet en dépendent.

Un vrai voyage : 422 fichiers de Prague

Les jeux de test peuvent flatter, alors voici un dossier tel qu’il est sorti d’un Lumix GX9 après un week-end à Prague : 396 JPEG de 20 MP, environ 11 Mo chacun, et 26 fichiers RAW à côté, 4,7 Go en tout. L’ouvrir lit l’EXIF de chaque fichier en 0,23 seconde. L’aperçu se redessine en 19 ms, un RAW se développe en 0,35 seconde et dix cartes postales se redessinent en 21 ms. Le 2026-11-03, deux chiffres ont manqué leur budget sur ces gros fichiers : l’export tournait à 7,6 photos par seconde et la mémoire culminait à 2,14 Go. La cause a été trouvée et corrigée dans la v0.9.7 : les JPEG s’exportent désormais à 10,1 par seconde, et tout le passage reste sous 1,31 Go.10,11

0,23 spour ouvrir les 422 fichiers, EXIF compris
19 mspour redessiner l’aperçu, p95 (budget 50 ms)
0,35 spour développer un RAW de 20 MP (médiane)
21 mspour redessiner dix cartes postales (budget 100 ms)
10,1 / sJPEG exportés (budget 8 / s)
1,31 Gopic de mémoire, JPEG et RAW (plafond 2 Go)

Deux budgets manqués, et retrouvés

Sur ces fichiers de 20 MP, la première exécution a manqué deux budgets : l’export tournait à 7,6 photos par seconde et la mémoire culminait à 2,14 Go, au-dessus du plafond de 2 Go. Chronométrer chaque étape d’une photo a montré où passait le temps : le décodage environ 100 ms, le recadrage 2 ms, et l’encodage du tirage 203 ms. L’encodeur d’impression optimisait ses tables en une seconde passe, qui gardait en mémoire chaque coefficient de l’image, environ 160 Mo par photo, environ 1,5 Go pour six photos à la fois, pour des fichiers plus petits de 0,9 % seulement. Avec les tables standard, il écrit le fichier par bandes : 138 ms, la même erreur par rapport à l’image rendue, quelques kilooctets de plus.

Une partie de la mémoire n’était pas du tout celle de Fotollection. Le benchmark faisait ses vignettes sur chaque cœur, là où Fotollection utilise deux fils en arrière-plan, et gardait ses propres mesures d’aperçu en vie pendant l’export ; mesuré comme Fotollection travaille, il reste 0,35 à 0,39 Go avant le début d’un export. Depuis la v0.9.7, le nombre de photos traitées à la fois suit aussi la plus grande photo de l’export (moins pour les très grandes), si bien que le pic reste sous le plafond quelle que soit la taille : 10,1 photos par seconde et 1,31 Go pour ce dossier.

Mémoire : 5 035 photos, et elle reste stable

Fotollection ne garde que quelques octets par photo en mémoire, écrit les vignettes dans un cache sur disque et ne travaille que sur autant d’images en taille réelle à la fois que son budget mémoire le permet. La mémoire reste donc stable quand un voyage grandit jusqu’à des milliers de photos.

1,45 Gopic de mémoire pour 5 035 photos
1,35 Gopic de mémoire pour 95 photos
53×plus de photos pour 0,1 Go de plus
Pic de mémoire à mesure que le lot grandit jusqu’à 5 035 photos
Pic de mémoire à mesure que le lot grandit jusqu’à 5 035 photos7

Pourquoi la mémoire ne grandit pas avec le dossier

Fotollection garde quelques octets par photo dans sa bibliothèque (13 Mo pour 5 035 photos), écrit les vignettes dans un cache sur disque au lieu de les garder, garde en mémoire un nombre limité d’aperçus, et ne travaille à la fois que sur autant de photos en pleine taille que son budget le permet. La grille à l’écran est virtuelle : seules les vignettes visibles existent. Pour le tester, les mêmes 95 photos ont été liées 53 fois dans un dossier de 5 035 fichiers :

95 photos 5 035 photos
Import et EXIF 5 ms, 7 Mo 383 ms, 13 Mo
Vignettes de 400 px vers le cache sur disque 47,8 photos/s 46,4 photos/s
Export, 6 à la fois 18,0 photos/s 15,4 photos/s, 0 échec
Pic mémoire de toute l’exécution 1,35 Go 1,45 Go

53 fois plus de photos coûtent 0,1 Go de plus. Le long export est un peu plus lent par photo uniquement parce qu’il a duré plus de cinq minutes, et le processeur d’un portable ralentit sous une charge prolongée.

Qualité de tirage : le tirage ressemble à la photo

Les tirages faits via un éditeur web semblent souvent ternes : il jette le profil de couleur, réduit la photo à 2 000 px et l’enregistre en qualité 80 avec la couleur divisée par deux. Fotollection garde le profil et exporte en pleine résolution en 4:4:4.

0,19d’erreur de couleur ; un œil commence à la voir à 1
4:4:4pleine résolution des couleurs ; un éditeur web la divise par deux
87 %du détail fin que perdent les 2 000 px d’un éditeur web
Ce que l’export garde de l’original, face à un éditeur web courant
Ce que l’export garde de l’original, face à un éditeur web courant7

Pourquoi les tirages issus d’un éditeur web paraissent ternes

Le test exporte 20 photos d’appareil et 5 versions Display P3 (la couleur plus large des téléphones et des Mac récents) par le véritable export de Fotollection, puis lit les deux fichiers avec un décodeur indépendant, les convertit en CIELAB via leurs profils de couleur et les compare pixel par pixel à l’original. Un export typique d’éditeur web passe par la même comparaison : profil abandonné, réduit à 2 000 px puis agrandi de nouveau pour le tirage, enregistré en qualité 80 avec la couleur divisée par deux (4:2:0).

Médiane Fotollection, sRGB Éditeur web Fotollection, Display P3 Éditeur web
ΔE2000 (erreur de couleur, invisible sous 1) 0,19 1,39 0,31 2,15
PSNR 52,6 dB 37,9 dB 50,8 dB 37,0 dB
Saturation conservée 100 % 99,9 % 99,9 % 86,8 %
Détail fin conservé 99,8 % 13 % 100 % 18 %

Deux causes expliquent l’aspect terne. Réduire à 2 000 px puis agrandir de nouveau pour le labo jette 87 % du détail fin qui rend un tirage net. Et abandonner le profil de couleur fait lire une photo Display P3 comme si elle était en sRGB, ce qui lui retire 13 % de sa saturation. Fotollection garde le profil (25 fichiers sur 25), exporte à la pleine résolution de la photo avec la couleur complète (4:4:4) en qualité 95 (mesuré alors ; 90 par défaut depuis la v0.13.0, toujours sous une différence visible), et ses plus grandes erreurs se trouvent uniquement sur les bords nets, là où tout JPEG peine le plus. Encore à venir : de vrais fichiers HEIC d’iPhone, et des tirages mesurés au spectrophotomètre.

Photos pour Facebook et Instagram : légères, et toujours la photo

Facebook réduit chaque photo à 2 048 px, la recompresse et ignore les profils de couleur. L’export Partage fait d’abord ce travail correctement, donc après Facebook la photo reste plus fidèle à elle-même que par la méthode habituelle.

99,6 %de la couleur d’une photo Display P3 gardée après Facebook, contre 86 %
2 048 pxla taille que Facebook laisse telle quelle
½du fichier en taille d’origine, chaque pixel gardé
Photos pour Facebook : ce que voient les gens après la recompression de Facebook
Photos pour Facebook : ce que voient les gens après la recompression de Facebook7

Ce que Facebook fait à une photo, et ce que nous faisons avant

Facebook réduit chaque photo à 2 048 px au plus, la recompresse en qualité 71 environ avec la couleur divisée par deux, et ignore les profils de couleur. L’export de partage fait ce travail correctement avant l’envoi, si bien que Facebook n’a plus rien à réduire : la photo est convertie en sRGB via son profil, redimensionnée avec un filtre de Lanczos en lumière linéaire, légèrement accentuée, et enregistrée en qualité 88. Chaque réglage a été choisi par la mesure : une accentuation plus forte (0,35 au lieu de 0,2) a obtenu un moins bon score, et les qualités 84 ou 80 perdaient plus qu’elles ne faisaient gagner.

Médiane Taille d’origine Facebook, 2 048 px Instagram, 1 080 px
Taille du fichier (JPEG d’appareil de 3,08 Mo) 1,42 Mo 0,51 Mo 0,24 Mo
SSIM par rapport au redimensionnement idéal (1 = identique) 0,981 0,979 0,982
ΔE2000 0,96 1,27 1,58

Après la recompression de Facebook, le résultat reste plus proche de la photo que la méthode habituelle (SSIM 0,965 contre 0,961), et une photo Display P3 garde 99,6 % de sa couleur au lieu de 86 %, parce que son profil a été converti en vraies couleurs sRGB au lieu d’être abandonné. Les préréglages redimensionnés restent au-dessus de ΔE 1 à cause de la couleur divisée par deux que chaque plateforme applique de toute façon ; Original size garde chaque pixel pour environ la moitié du fichier, sous ΔE 1.

RAW de l’appareil : ouvrez-le tel quel

Fotollection ouvre tels quels les fichiers RAW de neuf appareils courants, sans rien convertir et, sous Windows et Linux, sans rien installer. Depuis la v0.10.0, l’image complète est son propre développement pour chaque appareil à capteur Bayer, fait sur les données de l’appareil comme dans un éditeur RAW, alors qu’Adobe DNG Converter ne fait que transformer un fichier RAW en un autre.12,13,14,15

9–32 msla vignette d’un RAW, depuis l’aperçu contenu dans le fichier
0,3–0,7 sle développement de la photo complète par Fotollection
1,2–1,8 sAdobe DNG Converter par fichier, seulement pour le convertir
RAW de l’appareil : du fichier à l’écran, par appareil et face à Adobe DNG Converter
RAW de l’appareil : du fichier à l’écran, par appareil et face à Adobe DNG Converter7
Une photo RAW, du fichier au tirage
Une photo RAW, du fichier au tirage
La porte du développement : la photo à l’écran passe en premier, le travail en arrière-plan attend
La porte du développement : la photo à l’écran passe en premier, le travail en arrière-plan attend

Ce qu’un capteur enregistre vraiment

Le capteur d’un appareil photo est une grille de millions de minuscules puits appelés photosites. Tant que l’obturateur est ouvert, chacun recueille la lumière qui l’atteint et la transforme en charge électrique ; quand il se ferme, un convertisseur transforme chaque charge en nombre. La relation est linéaire : deux fois plus de lumière donne un nombre deux fois plus grand. Nos yeux ne sont pas linéaires du tout, ils jugent la luminosité en proportion, c’est pourquoi un fichier RAW paraît sombre et plat tant qu’il n’est pas développé.

Deux sortes de capteurs lisent cette grille :

  • CCD (dispositif à transfert de charge) fait glisser la charge de chaque photosite, rangée par rangée, vers un seul amplificateur au bord de la puce. C’était le capteur des premiers appareils numériques et de nombreux dos moyen format des débuts : des images propres, mais une lecture lente et une forte consommation.
  • CMOS donne à chaque photosite son propre amplificateur et en lit beaucoup à la fois. Il est plus rapide, consomme moins et coûte moins cher à fabriquer, si bien que presque chaque appareil et chaque téléphone en a un aujourd’hui. La plupart des capteurs CMOS lisent leurs rangées l’une après l’autre, c’est pourquoi un sujet rapide peut pencher sur une photo prise à l’obturateur électronique (le rolling shutter), et pourquoi les capteurs empilés, qui lisent bien plus vite, penchent moins.

Les nombres ont bien plus de paliers qu’un JPEG. Un appareil enregistre 12 ou 14 bits par photosite, 4 096 ou 16 384 niveaux, là où un JPEG garde 8 bits, 256 niveaux. Ces niveaux en plus sont ce qui permet de déboucher une ombre ou de baisser un ciel lumineux sans postérisation. Et l’absence de lumière n’est pas zéro : chaque capteur ajoute un petit décalage, le niveau de noir, pour que le bruit autour du noir ne soit pas coupé. Dans l’échantillon du Nikon D750, le noir vaut 600 et la valeur la plus haute que le capteur puisse contenir, le niveau de blanc, 15 520. La toute première chose que fait un développeur RAW est de ramener ces deux nombres à 0 et 1, pour chaque position du filtre coloré, car certains appareils donnent à chacune son propre niveau de noir.

La couleur vient d’un filtre sur chaque photosite

Un photosite ne mesure que la quantité de lumière qui arrive, jamais sa couleur. Pour voir la couleur, le capteur est couvert d’une matrice de filtres colorés : un minuscule filtre rouge, vert ou bleu sur chaque photosite, si bien que chacun ne compte qu’une partie du spectre.

  • Bayer, breveté par Bryce Bayer chez Kodak en 1976, répète un carré de 2 × 2 : un rouge, deux verts, un bleu. La moitié des photosites sont verts parce que nos yeux tirent l’essentiel de leur perception du détail du milieu du spectre, si bien que le vert porte l’essentiel de la netteté. Presque tous les appareils utilisent ce motif, dans l’une de quatre orientations (RGGB, BGGR, GRBG, GBRG) que le fichier doit indiquer.
  • X-Trans, le motif de Fujifilm depuis 2012, répète un carré de 6 × 6 avec du rouge, du vert et du bleu dans chaque rangée et chaque colonne. Sa disposition irrégulière rend le moiré coloré moins probable sur les détails fins répétitifs, si bien que Fujifilm peut se passer du filtre adoucissant que portent de nombreux capteurs, au prix d’une reconstruction plus difficile.
  • Autres conceptions : les capteurs monochromes n’ont aucun filtre, si bien que chaque photosite voit tout le détail (les appareils Monochrom de Leica) ; le Foveon de Sigma empile trois couches qui absorbent la couleur à différentes profondeurs du silicium ; beaucoup de téléphones regroupent quatre photosites d’une même couleur (Quad Bayer) et les lisent comme un seul en faible lumière.

Un capteur Bayer de 24 MP enregistre donc 24 millions de nombres, chacun pour une seule couleur : deux des trois couleurs de chaque pixel manquent. Transformer cette mosaïque en image est le travail du dématriçage, plus bas.

Ce que contient un fichier RAW

Un JPEG est une image terminée : l’appareil a déjà pris toutes les décisions. Un fichier RAW garde les nombres du capteur d’avant ces décisions, avec tout ce qu’il faut pour les prendre plus tard :

  • les échantillons eux-mêmes, un par photosite, et sous quelle couleur de filtre chacun se trouvait ;
  • les niveaux de noir et de blanc ;
  • la zone active (les photosites qui ont vu la lumière ; quelques rangées et colonnes sur les bords sont masquées exprès, pour mesurer le noir) et le recadrage par défaut de l’appareil ;
  • la balance des blancs choisie par l’appareil à la prise de vue ;
  • des matrices de couleur, qui disent comment le rouge, le vert et le bleu propres à ce capteur se rapportent aux couleurs que voient les gens ;
  • un aperçu, un JPEG fait par l’appareil lui-même, avec ses propres couleur et tonalité, plus les données EXIF.

Chaque fabricant a son propre format, le plus souvent bâti sur TIFF et en partie non documenté : CR2 et CR3 (Canon), NEF (Nikon), ARW (Sony), RW2 (Panasonic), ORF (Olympus), RAF (Fujifilm). Le DNG est le format qu’Adobe publie ouvertement (version 1.7), utilisé par Ricoh, Leica, Pentax et de nombreux téléphones, et celui dont cette page suit les règles.

Fotollection lit le DNG avec son propre lecteur, écrit d’après la spécification, et les autres formats sont décompressés par rawler, une bibliothèque LGPL intégrée à Fotollection. Les vignettes de la grille ne touchent jamais aux données du capteur : elles viennent de l’aperçu contenu dans le fichier, en 9 à 32 ms, c’est pourquoi un dossier de fichiers RAW s’ouvre aussi vite qu’un dossier de JPEG.

Le dématriçage : retrouver les deux couleurs manquantes

Reconstruire les deux couleurs manquantes de chaque pixel à partir de ses voisins s’appelle le dématriçage, et c’est l’étape qui décide plus que toute autre de la netteté et de la propreté d’une photo RAW. Chaque méthode fait face au même dilemme : moyenner les voisins est sûr dans les zones unies, mais à travers un bord cela mélange deux surfaces différentes, si bien que tout l’art est de savoir quels voisins vont ensemble.

  • Bilinéaire fait simplement la moyenne des photosites les plus proches de chaque couleur. C’est le plancher auquel chaque méthode se mesure : doux, et avec des franges colorées le long de chaque bord net, parce que le rouge, le vert et le bleu sont moyennés sur des endroits légèrement différents.
  • Malvar–He–Cutler (2004) part de cette moyenne et la corrige avec le détail de la couleur que le photosite a vue, par des filtres fixes de 5 × 5. Il est plus net et reste très rapide. Fotollection développait avec lui jusqu’à la v0.10.0.
  • PPG (patterned pixel grouping) décide d’abord dans quelle direction l’image change le moins, et n’interpole que dans cette direction. rawler l’utilise, tout comme les versions Windows et Linux de Fotollection pour la plupart des formats jusqu’à la v0.10.0.
  • RCD (ratio corrected demosaicing, de Luis Sanz Rodríguez) travaille sur des rapports entre les couleurs plutôt que sur des différences, ce qui tient mieux dans les zones claires comme sombres, et il est connu pour donner peu d’artefacts sur les détails fins ; darktable et RawTherapee le proposent.
  • Markesteijn, d’après Frank Markesteijn, est la méthode faite pour X-Trans, en une passe ou, plus lente et plus propre, en trois.
  • Le dématriçage de Fotollection depuis la v0.10.0 reprend la façon dont RCD décide de la direction, puis estime le vert de chaque côté, corrigé par la couleur propre du site (comme l’ont fait Hamilton et Adams), pondéré selon combien chaque côté varie. Nous avons d’abord écrit l’étape de rapport propre à RCD, et elle a obtenu de moins bons scores sur nos mires, si bien que la variante gagnante est celle qui est livrée, sous son propre nom.

Quand une méthode se trompe, cela se voit de quatre façons typiques :

  • fermeture éclair (zipper) : une rangée de pixels alternativement clairs et sombres le long d’un bord net, là où la méthode a pris des voisins des deux côtés ;
  • labyrinthe (maze) : un fin motif vermiculé dans les zones unies, quand les deux verts d’un carré Bayer ne lisent pas tout à fait la même chose (ils se trouvent sur des rangées aux voisins différents et, sur beaucoup de capteurs, diffèrent d’un ou deux pour cent) ;
  • fausse couleur : des points ou des franges colorés sur un détail en réalité gris, comme un tissu, des cheveux, un mur de briques ou une clôture lointaine ;
  • moiré : des ondes colorées sur des motifs répétitifs très fins, plus fins que ce que le filtre coloré peut échantillonner.

Comment nous en jugeons. Nos yeux se laissent facilement tromper par un résultat qui paraît plus net, alors chaque méthode est notée sur des images dont la vérité est connue exactement. Un ordinateur dessine cinq mires de 768 px : une mire de zones (des anneaux de plus en plus fins vers le bord, jusqu’au détail le plus fin que les photosites verts peuvent contenir), une étoile de Siemens à 72 branches, des barres de couleur saturée sur du gris dans trois directions, des dégradés de couleur doux, et un gris uni avec les deux verts écartés de 2 %. Chacune est transformée en ce qu’enregistrerait un capteur Bayer, dématricée et comparée à l’original. Le PSNR mesure l’erreur globale en décibels (plus haut, c’est mieux ; chaque 6 dB la divise par deux) ; la fausse couleur est la couleur moyenne qui apparaît sur les mires grises ; l’erreur de bord est l’erreur moyenne à moins de 2 px d’un bord.

Mire (768 px) Bilinéaire Malvar (le nôtre jusqu’à la v0.10.0) Le nôtre depuis la v0.10.0
Mire de zones : PSNR, plus haut est mieux 13,0 dB 17,3 dB 16,5 dB
Mire de zones : fausse couleur, plus bas est mieux 65,9 43,0 18,7
Étoile de Siemens : PSNR 21,3 dB 25,2 dB 37,9 dB
Étoile de Siemens : fausse couleur 9,4 8,4 0,16
Barres de couleur saturée : erreur le long des bords, plus bas est mieux 11,6 21,6 10,5
Dégradés doux : PSNR 78,9 dB 77,5 dB 78,4 dB
Gris uni avec un écart de vert : labyrinthe, plus bas est mieux 0,38 0,38 0
Texture avec pixels morts : restants pour 10 000, plus bas est mieux 35,8 66,5 0

Malvar fait environ 4 dB de mieux que le bilinéaire sur le détail gris fin, comme son article le promet, mais moins bien le long des bords entre couleurs fortes, parce que sa correction emprunte le détail d’une couleur pour les autres et suppose qu’elles varient ensemble, ce que ne fait pas un panneau rouge sur un mur gris. Aucun des deux ne supprime le labyrinthe, qui n’est pas un problème de dématriçage mais une différence entre les deux verts, à égaliser avant. Ce sont les lacunes que notre chaîne comble depuis la v0.10.0 : les pixels morts et le déséquilibre des verts sont corrigés tant que chaque site ne contient encore que ce qu’il a mesuré, le dématriçage directionnel reconstruit les couleurs, et un petit filtre médian sur les différences de couleur supprime la fausse couleur restante. Sur les mires, il gagne partout sauf sur le PSNR global de la mire de zones, 0,8 dB sous celui de Malvar près du détail le plus fin, là où chaque méthode crée du repliement ; même là, sa fausse couleur est divisée par deux. Sur les neuf vrais fichiers, il rapproche autant ou davantage le développement de chaque appareil Bayer du JPEG de l’appareil lui-même, et coûte environ 180 ms sur 24 MP, contre 40 pour Malvar : quelques dixièmes de seconde de plus par photo, pour des tirages au détail plus propre.

Des couleurs de l’appareil aux vôtres

Le rouge, le vert et le bleu de l’appareil ne sont pas ceux de votre écran : les filtres de chaque capteur utilisent leurs propres colorants, et ils se chevauchent autrement que les cônes de nos yeux. Les matrices de couleur du fichier transforment les couleurs de l’appareil en CIE XYZ, le modèle standard de la vision humaine des couleurs défini en 1931, et de là en sRGB, l’espace colorimétrique de la plupart des écrans et des laboratoires photo.

  • La balance des blancs vient en premier : un gain sur le rouge et sur le bleu, pour que quelque chose de blanc dans la scène sorte neutre. L’appareil enregistre les gains qu’il a choisis, et Fotollection les applique avant le dématriçage, si bien que les différences de couleur sur lesquelles reposent les méthodes ci-dessus restent petites.
  • Un DNG porte en général deux matrices, l’une mesurée sous une lumière de tungstène chaude et l’autre à la lumière du jour. La bonne pour votre photo se trouve entre les deux : le développeur déduit la lumière de la prise de vue de sa balance des blancs, sous forme de température de couleur, et mélange les deux. Fotollection fait de même pour les autres formats, à partir des matrices que rawler connaît pour chaque modèle d’appareil.
  • Tout cela se passe en lumière linéaire, sur l’échelle propre du capteur, avant toute courbe. Mélanger, mettre à l’échelle et redimensionner les couleurs en lumière linéaire est ce qui donne des résultats physiquement justes ; le faire après la courbe assombrit les bords et décale les couleurs.

Le rendu de l’appareil. Le JPEG d’un appareil n’est pas neutre : chaque fabricant ajoute son contraste, sa couleur et ses tons chair, et ce rendu est en partie la raison pour laquelle on choisit une marque. Depuis la v0.10.0, une photo RAW s’ouvre avec un rendu neutre, fidèle à la matrice du capteur, avec le vignetage d’objectif corrigé et l’exposition choisie par l’appareil ; Like the camera’s JPEG est à un clic dans la carte RAW colour d’une photo RAW, pour une photo ou pour tous les RAW à la fois. (Jusqu’à la v0.10.0, chaque RAW était ajusté au JPEG de l’appareil ; un projet enregistré à l’époque garde ce rendu.) Ce choix ajuste le JPEG de l’appareil des deux façons, une courbe et une matrice ou une courbe par canal, et garde celle qui s’en approche le plus pour ce fichier : sur le Nikon D750, il divise la différence par deux, de 2,26 à 1,16 en ΔE2000. Les vignettes de la grille gardent l’aperçu propre de l’appareil, comme dans Lightroom.

La tonalité : des nombres linéaires à une image

Les nombres linéaires paraissent sombres et ternes à l’écran, parce qu’un doublement de la lumière, que le capteur enregistre comme un nombre deux fois plus grand, nous semble n’être qu’un palier de luminosité. Une courbe de tonalité transforme l’échelle du capteur en image : elle place le gris moyen, relève les ombres, adoucit les hautes lumières au lieu de les écrêter d’un coup, et donne à l’image son contraste. L’image est ensuite enregistrée avec la courbe sRGB (son « gamma »), qui consacre davantage des 256 niveaux d’un JPEG aux ombres, là où nos yeux remarquent le plus les paliers.

Deux corrections qu’un appareil fait dans son JPEG ne sont pas dans les données brutes, et toutes deux comptent pour les tirages :

  • Vignetage de l’objectif : chaque objectif est plus sombre vers les coins. Fotollection mesure, d’après l’aperçu de l’appareil, de combien celui-ci les a éclaircis, sous forme de gain radial. Quand notre développement DNG a été comparé pour la première fois au JPEG de l’appareil, le centre était environ 4 L* trop clair et les coins 1,5 trop sombres ; le gain radial a fait passer la différence de ΔE 3,8 à 2,67, chaque zone de la photo restant à ±0,5 L*.
  • Distorsion : la légère forme en barillet ou en coussinet d’un objectif. Les appareils Micro Four Thirds (Panasonic, Olympus) sont conçus pour que l’appareil la corrige, et leurs fichiers indiquent comment. Sur Mac, ces fichiers sont développés par macOS, qui applique la correction ; la corriger dans notre propre développement est prévu (FR-085).

Comment Fotollection développe un RAW, étape par étape

Pour un développement complet, celui qui se trouve derrière l’aperçu d’impression, le zoom et l’export :

  1. Reconnaître le format à partir des premiers octets du fichier, jamais de son nom, si bien qu’un fichier renommé ou un RAW qui ressemble à un simple TIFF est quand même bien lu.
  2. Lire les nombres du capteur : le DNG avec notre propre lecteur, les autres formats décompressés par rawler. Un fichier trop gros ou endommagé est refusé avant qu’aucun pixel ne soit décodé, avec un code d’erreur.
  3. Niveaux : le noir à 0 et le blanc à 1, pour chaque position du filtre coloré, comptée depuis le coin de la zone active.
  4. Balance des blancs, puis dématriçage : les pixels morts et l’équilibre des verts d’abord, le dématriçage directionnel, le médian contre la fausse couleur (Markesteijn pour X-Trans arrive dans la v0.15.0).
  5. Couleur : les matrices de l’appareil, mélangées selon la lumière de la prise de vue, en lumière linéaire.
  6. Tonalité et rendu, ajustés à l’aperçu de l’appareil, avec son vignetage d’objectif.
  7. À partir de là, une photo RAW est comme n’importe quelle autre : recadrage, date incrustée, cadre, format d’impression et profil de couleur, exportée en pleine résolution en 4:4:4 en qualité 95.

Quelques règles valent tout du long. Un seul développement tourne à la fois, réparti sur chaque cœur du processeur, et jamais sur le fil propre de la fenêtre, si bien que Fotollection continue de répondre pendant qu’une photo de 30 MP se développe. Les exports tournent toujours sur le processeur, si bien qu’un tirage sort identique sur chaque ordinateur ; la carte graphique n’accélère que ce que vous voyez pendant la retouche. Et le code est le nôtre, écrit d’après les spécifications et les articles publiés, pas copié d’autres projets, puis vérifié : sur les mires synthétiques ci-dessus, sur neuf fichiers RAW de neuf appareils (CC0, de raw.pixls.us), et en coupant et corrompant des fichiers exprès pour qu’un mauvais fichier donne une erreur, jamais un plantage.

Depuis la v0.10.0 : notre propre développement pour chaque appareil Bayer. rawler ne fait que décompresser les fichiers, et le reste est l’œuvre de Fotollection. Développement complet des neuf fichiers d’exemple, médiane de 3, sur le même portable : notre développement avec son dématriçage plus propre, contre celui, plus simple, de rawler et celui de macOS :

Appareil (format) Celui de Fotollection rawler macOS
Panasonic GX9 (RW2, 20 MP) 280 ms 216 ms 436 ms
Panasonic S5 (RW2, 24 MP) 442 ms 301 ms 1 044 ms
Olympus E-M10 III (ORF, 16 MP) 308 ms 364 ms 1 164 ms
Sony A7 III (ARW, 24 MP) 372 ms 241 ms 488 ms
Canon R10 (CR3, 24 MP) 494 ms 360 ms 1 647 ms
Ricoh GR III (DNG, 24 MP) 523 ms 650 ms —
Nikon D750 (NEF, 24 MP) 502 ms 402 ms 412 ms
Canon 5D Mark IV (CR2, 31 MP) 691 ms 565 ms 418 ms
Fujifilm X-T3 (RAF, 26 MP, X-Trans) à venir 524 ms 1 339 ms

Le nôtre prend un dixième à un quart de seconde de plus que celui de rawler pour son dématriçage plus propre et sa couleur ajustée, et reste plus rapide que macOS sur la plupart des appareils ; cela n’arrive qu’une fois par photo, et un curseur refinit ensuite une copie gardée en 4 à 11 ms. Sur Mac, les fichiers Panasonic et Olympus restent avec macOS pour sa correction d’objectif, jusqu’à ce que notre propre développement corrige la distorsion. Les plages grises du S5 sortent plus neutres qu’avec rawler (une dominante de 1,42 contre 2,43, où 0 est parfaitement gris). Fujifilm X-Trans suit avec Markesteijn, et après lui le développement sur la carte graphique pour l’aperçu, avec le résultat du processeur comme référence.

Suggestions de meilleure photo : vérifiées face au choix d’une personne

Nous avons trié à la main 95 vraies photos en 22 moments et choisi la meilleure photo là où il y en avait une évidente. Les groupes et suggestions de Fotollection ont ensuite été vérifiés face à ce choix.

6 sur 6moments avec une meilleure évidente : une suggestion acceptable
15 sur 22moments trouvés, jamais deux confondus
17 mspour analyser une photo, 28 ms avec les visages
Suggestions de meilleure photo, notées face à des photos triées à la main
Suggestions de meilleure photo, notées face à des photos triées à la main7

Comment les propositions sont faites, et notées

D’abord, les moments sont trouvés. Les photos sont classées selon l’heure de prise de vue, à la fraction de seconde près, et un nouveau moment commence quand l’écart dépasse 2 secondes ou quatre fois l’écart habituel, quand l’appareil ou l’objectif change, ou quand le lieu se déplace de plus de 30 m. Chaque photo reçoit aussi une petite signature visuelle, sa répartition des clairs et des sombres et son mélange de couleurs, et une photo ne rejoint le moment que si elle ressemble encore aux précédentes, en tolérant un pas de côté ou un zoom que la focale explique.

Ensuite, au sein d’un moment, chaque photo est mesurée sur une copie réduite : la netteté du sujet, le flou de bougé, l’exposition (hautes lumières écrêtées, ombres bouchées, luminosité), le bruit et, s’il y a des visages, si les yeux sont ouverts et les visages tournés vers l’appareil. Chaque mesure n’est comparée qu’aux autres photos du même moment, et pondérée (netteté du sujet 35 %, yeux ouverts 20 %, bougé 15 %, exposition 15 %, hautes lumières écrêtées 10 %, le reste moins), avec un pas minimal pour qu’une différence trop petite pour se voir sur un tirage ne décide jamais. La proposition arrive avec sa raison, rien n’est supprimé, et tout tourne sur votre ordinateur en 17 ms par photo, 28 ms avec des visages.

Pour rester honnête, 95 vraies photos ont été triées à la main en 22 moments, avec la photo à garder pour les 6 moments qui avaient une meilleure photo nette. Chaque amélioration a été notée par rapport à ce tri :

Étape Moments trouvés (sur 22) Fusions erronées Choix acceptables
Empreinte de l’image seule 3 0 2 sur 2
Plus répartition et couleur 13 0 3 sur 4
Plus le zoom d’après la focale 15 0 5 sur 6
Plus une netteté équitable et les visages cachés 15 0 6 sur 6

Deux moments différents ne sont jamais regroupés ; les deux groupes en trop sont des paires marquées comme incertaines à la main. Les moments encore manqués sont ceux où la pose ou le cadrage change beaucoup, comme un plat photographié de nouveau depuis l’autre côté.

Les mots derrière les chiffres

Le jargon de la photo et du tirage, expliqué comme on l’expliquerait à un ami.

Qu’est-ce que le ΔE (Delta E) ?16

Le ΔE mesure à quel point deux couleurs semblent éloignées pour l’œil humain, calculé dans un espace colorimétrique construit pour correspondre à notre vision (CIELAB, avec la formule de 2000). 0 veut dire identique. Autour de 1, c’est la plus petite différence qu’un œil exercé repère côte à côte ; de 2 à 3, elle est visible pour la plupart des gens ; au-dessus de 5, les couleurs semblent différentes. L’export pour le tirage de Fotollection est en moyenne à 0,19.

Qu’est-ce que le SSIM ?17

Le SSIM, l’indice de similarité structurelle, compare les formes et les textures de deux images plutôt que des pixels isolés, ce qui est plus proche de la façon dont on remarque le flou ou une compression en blocs. 1 veut dire identique. Au-dessus d’environ 0,98, la plupart des gens ne distinguent pas les deux sans zoomer.

Combien de couleurs un JPEG peut-il contenir ?6,18

Un JPEG stocke 8 bits pour chacun du rouge, du vert et du bleu : 256 niveaux chacun, environ 16,7 millions de couleurs. C’est aussi ce à partir de quoi impriment les labos photo. Les fichiers RAW des appareils contiennent 12 à 14 bits et les iPhone récents peuvent enregistrer du HEIC 10 bits, ce qui aide à la retouche ; pour un tirage fini, un JPEG 8 bits bien fait ne montre aucune marche entre les tons.

JPG ou JPEG ? Et faut-il utiliser le PNG ?

JPG et JPEG sont le même format : l’ancien Windows n’autorisait que des extensions de trois lettres. Le PNG est sans perte, donc rien n’est jamais jeté, mais une photo enregistrée en PNG est souvent trois à cinq fois plus lourde, et la plupart des bornes et des labos attendent du JPEG. Un JPEG en qualité 90 ou plus avec la pleine résolution des couleurs (4:4:4), comme Fotollection l’exporte pour le tirage, ne se distingue pas de l’original sur papier.

Que veulent dire 4:4:4 et 4:2:0 ?

Nos yeux voient le détail surtout dans la luminosité, moins dans la couleur, donc le JPEG peut stocker la couleur à une résolution plus basse. Le 4:4:4 garde la pleine résolution des couleurs ; le 4:2:0 en garde un quart, ce qui allège les fichiers mais adoucit les bords colorés, comme un texte rouge ou un ciel bleu derrière des feuilles. Les tirages méritent le 4:4:4 ; les réseaux sociaux recompressent tout en 4:2:0 de toute façon.

sRGB, Display P3, Adobe RGB et profils de couleur19,20,21

Un profil de couleur dit au logiciel ce que signifient les nombres d’un fichier. Le sRGB est la gamme de couleurs classique du web. Le Display P3, utilisé par les iPhone et les appareils récents, atteint environ 25 % de couleurs en plus, surtout dans les rouges et les verts. Si une photo P3 perd son profil, ses nombres sont lus comme du sRGB et elle paraît délavée : c’est la perte de saturation de 13 % que nous avons mesurée. L’Adobe RGB, que certains appareils proposent pour le tirage, est aussi plus large que le sRGB, surtout dans les verts et les cyans. Fotollection garde le profil qu’a une photo pour les tirages et convertit correctement en sRGB pour les réseaux sociaux.

Quel DPI faut-il pour un tirage ?

Le DPI, c’est le nombre de pixels qui tombent sur chaque pouce de papier. À 300 DPI, un tirage paraît net même de près ; de 150 à 200 DPI suffit à bout de bras. Un tirage 10 × 15 cm à 300 DPI demande 1 800 × 1 200 pixels, donc n’importe quelle photo de téléphone ou d’appareil suffit ; le conseil de taille dans l’application vous dit jusqu’où chaque photo peut aller.

Pourquoi les photos paraissent-elles moins belles sur Facebook ?

Facebook redimensionne chaque photo à 2 048 px au plus, la recompresse en qualité inférieure avec la résolution des couleurs divisée par deux, et jette les profils de couleur. Une photo qui arrive trop grande est redimensionnée deux fois, une fois par vous et une fois par Facebook. L’envoyer déjà en 2 048 px, en sRGB et légèrement accentuée, signifie que Facebook ne la recompresse qu’une fois, et les couleurs sont déjà justes.

Lancez les mesures vous-même

Tout est reproductible sur vos propres photos. Les scripts n’envoient ni ne copient jamais une photo ; seuls les chiffres sont gardés. Les tableaux complets, avec chaque passage, sont dans RESULT.md.

bench/run.sh ~/Pictures/some-folder 3
uv run bench/quality/audit.py ~/Pictures/some-folder /tmp/out
uv run bench/quality/share_audit.py ~/Pictures/some-folder /tmp/share

Lire RESULT.md sur GitHub Retour à l’accueil

  1. 1. Le SIMD (single instruction, multiple data) permet à un processeur de traiter plusieurs valeurs à la fois : une instruction agit sur plusieurs nombres placés côte à côte dans un large registre vectoriel, comme le rouge, le vert et le bleu de nombreux pixels. Les processeurs Intel et AMD le proposent sous le nom de SSE et AVX ; Apple silicon et les autres processeurs Arm sous celui de NEON. Intel, AMD et Arm sont des marques de leurs propriétaires.
  2. 2. Unités : px est un pixel, un point d’une image ; MP (mégapixel) est un million de pixels, donc une photo de 20 MP fait environ 5 472 × 3 648 px ; ms est une milliseconde, un millième de seconde ; Mo et Go sont des mégaoctets et des gigaoctets ; la RAM (mémoire vive) est la mémoire de travail de l’ordinateur.
  3. 3. Rust et le logo Rust sont des marques de la Rust Foundation. Le cœur de Fotollection est écrit en Rust et tourne directement sur votre ordinateur.
  4. 4. L’EXIF (Exchangeable Image File Format) est la norme, tenue par la JEITA et la CIPA japonaises, des informations qu’un appareil écrit dans chaque photo : l’appareil et l’objectif, la date et l’heure, l’exposition, souvent la position GPS, et une petite vignette intégrée.
  5. 5. Un fichier RAW contient ce que le capteur de l’appareil a enregistré avant que l’appareil n’en fasse une image, donc la couleur, la luminosité et le détail peuvent encore être décidés plus tard, un peu comme on développe un négatif. Chaque fabricant a son format (CR3 pour Canon, NEF pour Nikon, ARW pour Sony, RW2 pour Panasonic et d’autres) ; le DNG (Digital Negative) est le format RAW ouvert publié par Adobe.
  6. 6. Le JPEG est le format d’image du Joint Photographic Experts Group, normalisé comme ISO/IEC 10918-1 et UIT-T T.81.
  7. 7. Pour chaque graphique : les chiffres sont donnés à titre indicatif, mesurés sur un portable ordinaire (Apple M3, 16 Go) ; les vôtres dépendent de l’ordinateur que vous utilisez.
  8. 8. Adobe, Lightroom et Lightroom Classic sont des marques d’Adobe Inc. aux États-Unis et dans d’autres pays. Fotollection n’a aucun lien avec Adobe et n’est pas approuvé par Adobe ; il reprend les raccourcis et la disposition que connaissent déjà les utilisateurs de Lightroom. Le logo Lightroom provient de Wikimedia Commons, où il est dans le domaine public en tant que logo textuel.
  9. 9. La fenêtre de l’application est construite avec Tauri et dessinée par la vue web du système : WebKit (WKWebView) sous macOS, Microsoft Edge WebView2 sous Windows et WebKitGTK, le portage GTK de WebKit, sous Linux. Tauri est un projet du Tauri Programme au sein de la Commons Conservancy ; WebKit est une marque d’Apple Inc. ; GTK est un projet de la GNOME Foundation ; Microsoft Edge et WebView2 sont des marques de Microsoft Corporation. La comparaison avec le navigateur a exécuté la même tâche dans Chromium 156 sans interface, le projet open source derrière Google Chrome, avec un Web Worker par cœur de processeur.
  10. 10. Le dossier de Prague appartient à l’auteur et n’est pas publié (© @hoangphi01, tous droits réservés). Médianes de 3 passages de bench/trip.sh et de measure_folder sur ses JPEG, sur un Apple M3 avec 16 Go, avec d’autres applications ouvertes, le 2026-11-04, avec l’export de la v0.9.7 ; lancez-les sur un dossier à vous pour comparer.
  11. 11. p50 et p95 sont des centiles : p50, la médiane, est le temps sous lequel est restée la moitié des passages ; p95 est le temps sous lequel sont restés 95 passages sur 100, il montre donc les cas lents qu’une moyenne cache.
  12. 12. Adobe DNG Converter n’a pas été lancé pour cette page. Le chiffre est une estimation d’un tiers (1 000 fichiers CR3 en 20 à 30 minutes sur du matériel récent, machine non précisée), tirée de l’article de blog de convertintomp4.com sur la conversion RAW vers DNG par lots. Adobe est une marque déposée d’Adobe Inc.
  13. 13. CMOS et CCD sont les deux types de capteur d’image, une grille de cellules sensibles à la lumière qui transforme la lumière en charge électrique. Presque tous les appareils photo et téléphones utilisent aujourd’hui le CMOS (complementary metal-oxide-semiconductor) ; le CCD (charge-coupled device) était courant dans les appareils plus anciens.
  14. 14. Le PSNR (peak signal-to-noise ratio) compare deux images pixel par pixel et donne leur différence en décibels : plus il est haut, plus elles sont proches. Au-dessus d’environ 40 dB, la différence est difficile à voir.
  15. 15. Le TIFF (Tagged Image File Format) est un format d’image souple, aujourd’hui tenu par Adobe ; de nombreux formats RAW, dont le DNG, reposent sur sa structure.
  16. 16. ΔE2000 (CIEDE2000) est la formule d’écart de couleur de la Commission internationale de l’éclairage (CIE), normalisée comme ISO/CIE 11664-6 ; l’espace colorimétrique CIELAB dans lequel elle travaille est l’ISO/CIE 11664-4.
  17. 17. Le SSIM a été présenté par Zhou Wang, Alan C. Bovik, Hamid R. Sheikh et Eero P. Simoncelli dans Image quality assessment: from error visibility to structural similarity, IEEE Transactions on Image Processing, 13(4), 2004.
  18. 18. Le HEIF (High Efficiency Image File Format) est le format d’image de la norme ISO/IEC 23008-12 ; le HEIC en est la variante compressée en HEVC (H.265), dans laquelle les iPhone enregistrent leurs photos par défaut. Une photo HEIC fait environ la moitié d’un JPEG de qualité semblable.
  19. 19. Le sRGB a été créé par HP et Microsoft en 1996 et normalisé comme CEI 61966-2-1.
  20. 20. Display P3 est un espace colorimétrique défini par Apple Inc., fondé sur l’espace DCI-P3 de l’industrie du cinéma (SMPTE).
  21. 21. Adobe RGB (1998) est un espace colorimétrique spécifié par Adobe Inc. ; Adobe est une marque déposée d’Adobe Inc.

Les photos de Prague des captures d’écran (les tramways, les rues, la Vltava) ont été prises par @hoangphi01 avec un Lumix GX9 en novembre 2026 : © @hoangphi01, tous droits réservés. Elles ne sont pas couvertes par la licence de l’application et ne peuvent pas être réutilisées. Les autres photos de démonstration sont dans le domaine public (CC0) sur Wikimedia Commons, par Dktue (7 photos), Pierre Blaché de Paris, France (2) et Kate Branch (1). Le chat des captures du panier d’impression et de la meilleure photo a aussi été photographié par @hoangphi01 avec le GX9, tous droits réservés ; les copies plus floues, bougées et plus sombres à côté ont été faites à partir de cette seule photo, pour montrer comment la meilleure photo est choisie. Chaque fichier, sa page et sa somme de contrôle.

Les mesures RAW utilisent neuf échantillons du domaine public (CC0) de raw.pixls.us, un par format ; scripts/fetch-raw-samples.py les télécharge et les vérifie.

Les formats RAW cités sur ce site appartiennent aux fabricants d’appareils qui les définissent : RW2 (Panasonic Holdings Corporation), CR2 et CR3 (Canon Inc.), NEF (Nikon Corporation), ARW (Sony Group Corporation), RAF (FUJIFILM Corporation) et ORF (OM Digital Solutions Corporation, anciennement Olympus). Le DNG est une spécification ouverte publiée par Adobe Inc. Fotollection les lit avec un lecteur intégré à Fotollection, et sous macOS d’abord avec les codecs du système (sous Windows, la Raw Image Extension de Microsoft est un dernier recours si elle est installée) ; il n’est fait ni approuvé par aucune de ces entreprises.

Les noms et logos d’appareils des captures d’écran et du cadre d’infos de l’application sont des marques de leurs propriétaires, utilisées uniquement pour montrer quel appareil a pris une photo : Apple (Apple Inc.), Canon (Canon Inc.), Fujifilm (FUJIFILM Corporation), Hasselblad (Victor Hasselblad AB), Leica (Leica Camera AG), Lumix (Panasonic Holdings Corporation), Nikon (Nikon Corporation), Noritsu (Noritsu Koki Co., Ltd.), Phase One (Phase One A/S), Ricoh (Ricoh Company, Ltd.), Samsung (Samsung Electronics Co., Ltd.) et Sony (Sony Group Corporation).

Apple et macOS sont des marques d’Apple Inc. ; Windows de Microsoft Corporation ; Linux est la marque déposée de Linus Torvalds aux États-Unis et dans d’autres pays ; Ubuntu de Canonical Ltd. ; Debian de Software in the Public Interest, Inc. ; Fedora, Red Hat, RHEL et CentOS de Red Hat, Inc. ; openSUSE de SUSE LLC ; Pop!_OS de System76, Inc. ; Rocky Linux de la Rocky Enterprise Software Foundation ; AlmaLinux de l’AlmaLinux OS Foundation ; ChromeOS de Google LLC ; NVIDIA de NVIDIA Corporation ; les noms des autres distributions Linux appartiennent à leurs projets ; Facebook et Instagram de Meta Platforms, Inc. ; GitHub de GitHub, Inc. ; Google Analytics de Google LLC ; Lightroom d’Adobe Inc. ; IrfanView d’Irfan Škiljan ; VietQR de NAPAS ; Wikimedia Commons de la Wikimedia Foundation. Les marques Apple, Windows et Linux (Tux, dessiné à l’origine par Larry Ewing) viennent de Simple Icons (CC0) et montrent seulement de quel système parle une colonne ou une étape.

Fotollection est un projet open source indépendant. Il n’est ni affilié à, ni sponsorisé, ni approuvé par aucune de ces entreprises, et toute autre marque appartient à son propriétaire.

Le nom et le logo Fotollection désignent l’application officielle, faite par @hoangphi01. Les téléchargements officiels viennent uniquement de fotollection.org et des versions GitHub du projet. La licence GPL-3.0 permet à chacun de partager ou de vendre des copies, modifiées ou non, à condition de garder cette licence et de proposer le code source ; une copie modifiée ou revendue ne doit pas utiliser le nom ou le logo Fotollection d’une manière qui laisse croire qu’il s’agit de l’application officielle.

Vous partagez ou vendez Fotollection, ou vous construisez dessus ? Merci de prévenir l’auteur d’abord en ouvrant une issue sur GitHub (github.com/hoangphi01/fotollection/issues). L’application est gratuite et faite sur le temps libre ; un petit mot est la façon juste de dire merci.

Vous citez, testez ou présentez l’application, ou utilisez ces captures d’écran ? Merci de créditer Fotollection et de mettre un lien vers fotollection.org.