Pourquoi chaque image importée sur LUVI devient un JPEG ou un PNG

Les photos HEIC d’iPhone échouaient dans Chrome, le WebP déroutait la moitié des modèles, et un décodeur navigateur mettait 27 secondes sur une photo de 12 mégapixels. Conversion déplacée côté serveur, avec une règle : chaque image est stockée en JPEG ou en PNG, couleur et orientation intactes.

Publié:

Des dizaines de cartes translucides colorées traversent un point de lumière indigo et ressortent sous la forme de deux tuiles : l'une d'un blanc brillant, l'autre à damier transparent.

L’import d’images passe pour la partie ennuyeuse d’une plateforme de génération. C’était pourtant notre source la plus tenace de courriers au support. Voici ce qui déraillait, ce que nous avons essayé, et la règle qui a réglé le problème.

Qu’est-ce qui déraillait ?

Le HEIC. Chaque iPhone photographie dans ce format par défaut. Safari sait le décoder, Chrome et Firefox non. Un utilisateur de Chrome qui importait une photo de téléphone recevait donc soit une erreur, soit un fichier qu’aucun modèle n’acceptait.

Le WebP et l’AVIF. Les navigateurs les adorent, les fournisseurs de modèles beaucoup moins. Plusieurs variantes les refusaient net, d’autres les acceptaient et échouaient en silence plus tard.

L’orientation et la couleur. Une photo prise de côté porte une balise de rotation que certains décodeurs respectent et que d’autres ignorent. Une photo d’iPhone porte un profil colorimétrique Display P3 qui, perdu à la conversion, rend l’image terne.

Pourquoi ne pas convertir dans le navigateur ?

Convertir dans le navigateur avant l’import est le réflexe évident, et nous l’avons tenté. Nous avons livré un décodeur HEIC en WebAssembly, et il est mort le jour même : la bibliothèque compile son worker avec new Function, ce que notre politique de sécurité du contenu (celle qui protège l’application des scripts injectés) n’autorise pas. Chaque import HEIC sous Chrome levait une EvalError.

La version de cette bibliothèque compatible avec la politique de sécurité tournait, mais une photo de 12 mégapixels demandait 27 secondes de décodage sur un ordinateur portable. Le même fichier prend 1,4 seconde sur le serveur. Et le HEIC était de toute façon plus petit que le JPEG qu’il produisait, si bien que convertir sur l’appareil n’économisait aucune bande passante. Nous avons retiré le décodeur du navigateur.

Quelle est la règle aujourd’hui ?

Chaque image est stockée en JPEG ou en PNG. Le format est lu dans les octets, jamais dans le nom du fichier ni dans le type de contenu : un JPEG nommé .png est stocké comme un JPEG. Les imports JPEG et PNG sont conservés octet pour octet. Tout le reste est converti sur le serveur :

  • En PNG si un seul pixel est transparent, pour que rien ne soit aplati sur un fond.
  • En JPEG en qualité 92 avec la chrominance complète sinon.
  • La rotation EXIF est appliquée : l’image stockée est droite.
  • Le profil colorimétrique embarqué est conservé : une image Display P3 d’iPhone ressort telle qu’elle apparaissait sur le téléphone.
  • Un GIF ou un WebP animé garde sa première image. Un SVG est rastérisé à 2 048 px sur son grand côté.

La pile de décodage est précise. Une bibliothèque prend en charge le WebP, le GIF, l’AVIF, le TIFF et le SVG. Un décodeur HEIC dédié s’occupe du HEIC, parce que le décodeur généraliste ne gère que la variante AV1. Un petit lecteur BMP complète l’ensemble, parce que la bibliothèque d’images n’en a pas. ICO, PSD et JPEG XL ne peuvent pas être convertis et sont refusés avec un message clair.

Où la conversion s’exécute-t-elle ?

Sur le serveur, et chaque point d’entrée passe par la même fonction : la boîte de dialogue d’import, l’import par URL, le chemin direct vers le stockage qu’empruntent les gros fichiers, et le ticket d’import du connecteur pour Claude. Quand un fichier est déjà dans le stockage, il est relu, converti, écrit sous son nouveau nom, et l’original n’est retiré qu’ensuite. La réponse à l’import vous indique le nom du fichier stocké et le format d’origine.

Qu’est-ce qui change pour vous ?

Les photos de téléphone s’importent dans tous les navigateurs. Chaque modèle reçoit un format qu’il accepte. Les téléchargements sont des fichiers que n’importe quelle application ouvre. Et la conversion prend environ une seconde, de notre côté, une seule fois.

Les limites, pour mémoire : images jusqu’à 50 Mo ; vidéo, audio, 3D et PDF jusqu’à 1 Go. La liste complète des formats acceptés est dans le centre d’aide : quels formats et quelles tailles de fichiers puis-je importer ? et pourquoi mon fichier HEIC ou WebP est-il devenu un JPEG ?

Questions

Est-ce que je perds en qualité ?

Les imports JPEG et PNG sont stockés octet pour octet. Les autres formats sont réencodés une seule fois en haute qualité : PNG s’il y a de la transparence, JPEG en qualité 92 sans sous-échantillonnage de la chrominance sinon.

Pourquoi ne pas conserver aussi le HEIC ?

Parce que rien en aval ne le lit de façon fiable : la plupart des modèles le refusent et les navigateurs ne sont pas d’accord entre eux. Le fichier converti est celui que chaque modèle, chaque navigateur et chaque téléchargement peut utiliser.

Qu’est-ce qui est encore refusé ?

ICO, PSD et JPEG XL. Enregistrez-les d’abord en JPG ou en PNG.

À lire aussi dans Côté LUVI