ODIFF : la comparaison d’images pixel par pixel qui tient en une seconde
⏱️ Temps de lecture estimé : 3 minutes
https://github.com/dmtrKovalenko/odiff
📌 ODIFF est un outil de comparaison d’images pixel par pixel, taillé pour les visuels presque identiques : captures d’écran, photos recadrées, rendus d’IA. L’accroche du README est nette — « l’outil de différence d’images le plus rapide du monde ». Un binaire natif écrit en Zig, avec des optimisations SIMD, qui compare deux captures pleine page en environ une seconde, là où pixelmatch et ImageMagick en demandent six ou sept.
Au quotidien, Odiff se commande en une ligne : le chemin des deux images et, en option, un fichier de sortie. La surprise arrive quand on ne donne pas ce fichier : le résultat s’affiche directement dans le terminal, à condition qu’il parle le protocole graphique kitty. iTerm2, Ghostty, kitty, WezTerm et Warp le font. La zone modifiée apparaît en rouge dans votre console, sans ouvrir aucun visualiseur. C’est rare, et c’est honnêtement agréable.
Le paquet npm s’appelle odiff-bin et embarque le binaire pour chaque plateforme. L’API JavaScript tient en une fonction compare() qui renvoie { match: true } ou le détail des pixels différents. Pour une application longue durée, un mode serveur garde le processus vivant et évite de forker à chaque appel — le README recommande ODiffServer dès qu’on compare plusieurs images à la suite.
- ⚡ Environ six fois plus rapide que pixelmatch et ImageMagick sur les mêmes captures, y compris en 8K.
- 🖥️ Affichage du diff dans iTerm2, Ghostty, kitty, WezTerm ou Warp, sans fichier de sortie.
- 🧩 Détection d’antialiasing, zones à ignorer et seuil de tolérance réglable.
- 🖇️ Le moteur de comparaison d’Argos, LostPixel et Visual Regression Tracker.
- 🏷️ Licence MIT, binaires précompilés pour la plupart des plateformes, 100 % de couverture de tests.
ODIFF accepte PNG, JPEG, WEBP et TIFF, y compris des mélanges de formats — un JPG contre un PNG passe sans conversion. L’algorithme mesure la différence visuelle avec le modèle YIQ NTSC, celui que l’œil perçoit, et des options permettent de limiter la mémoire ou d’échouer proprement quand les deux images n’ont pas la même mise en page.
Côté tests visuels, l’écosystème fait le travail d’argumentaire : playwright-odiff ajoute toHaveScreenshotOdiff, cypress-odiff fait de même côté Cypress, et des services comme Argos, LostPixel ou Visual Regression Tracker tournent sur le moteur. Argos annonce être devenu huit fois plus rapide en adoptant le binaire. Le README livre aussi le chiffre qui parle aux équipes : 25 000 captures par mois et un gain de trois secondes par snapshot représentent environ vingt heures de CI économisées chaque mois.
Je trouve l’approche saine : un binaire qui ne fait qu’une chose et la fait vite, plutôt qu’un framework qui promet tout. La seule attention concerne l’installation hors écosystème Node, qui passe par les binaires des releases. Et si la comparaison ressemble à celle de pixelmatch, la constance des performances sur les grandes images change réellement la vie des pipelines de tests visuels.





