Les iPhone capturent en HEIC par défaut — environ deux fois moins volumineux qu'un JPEG équivalent — mais Chrome et Firefox ne savent pas afficher ce format. Jusqu'à récemment, le composant image de Laravel rejetait les fichiers HEIC avant même qu'ils n'atteignent le pilote. Laravel 13.24 change la donne : il accepte HEIC, HEIF et AVIF en entrée, ajoute toHeic() pour la sortie et enseigne ces trois formats à la règle de validation image. Cette prise en charge a été apportée par @riasvdv (PR #60922).
Côté serveur, le décodage HEIC exige l'extension Imagick compilée avec le délégué HEIF d'ImageMagick (basé sur libheif) ; GD ne peut pas lire le HEIC du tout. De nombreux paquets de distribution livrent ImageMagick sans ce délégué, donc vérifiez avec php -r "print_r(Imagick::queryFormats('HEI*'));" — un tableau vide signifie que l'extension ne peut pas traiter ces fichiers. Sous Debian/Ubuntu, le délégué se trouve dans libheif1 ; la formule Homebrew imagemagick l'inclut. AVIF est plus simple, car GD peut le décoder si PHP est compilé contre libavif. Intervention Image (^4.0) sous-tend les deux pilotes.
La validation ne demande aucune configuration : la règle image reconnaît désormais heic, heif et avif, si bien qu'une photo envoyée directement depuis un iPhone passe là où elle échouait auparavant. La règle mimes (par ex. mimes:jpg,png,webp,heic) fonctionne aussi ; les deux règles déterminent le type à partir du contenu du fichier plutôt que du type MIME déclaré par le navigateur, qui varie pour le HEIC entre image/heic, image/heif et autres.
Comme les navigateurs ne peuvent pas afficher les HEIC stockés, la conversion doit se faire lors de l'upload : $request->image('photo')->usingImagick()->orient()->scale(width: 2000)->toWebp()->quality(80)->store('photos'). usingImagick() est indispensable car le pilote GD par défaut échoue sur le HEIC, et orient() applique les métadonnées de rotation courantes sur les photos de téléphone. store() génère un nom de fichier haché avec la bonne extension : un upload converti aboutit en photos/{hash}.webp.
Pour servir de l'AVIF avec un repli WebP, on dérive les deux variantes d'une même source préparée — chaque transformation renvoie une nouvelle instance, sans fuite d'état — puis on laisse le navigateur choisir via un élément <picture> avec une <source> AVIF. L'AVIF est typiquement 20 à 30 % plus léger que le WebP à qualité comparable, mais son encodage est plus lent ; dès qu'on génère plusieurs tailles, un job en file d'attente s'impose.
L'écriture de HEIC est également possible via toHeic() ou optimize('heic'), utile pour des archives ou exports destinés aux appareils Apple. L'alias heif est normalisé en HEIC partout : les fichiers sont stockés avec l'extension canonique .heic et mimeType() rapporte image/heic. Image::extension() reconnaît aussi les alias image/x-heic et image/x-avif.
Les formats non pris en charge qui atteignent le pilote déclenchent une ImageException nommant le type fautif (par ex. « The image format [image/tiff] is not supported. »). La même exception apparaît quand un HEIC rencontre un build Imagick sans délégué HEIF — un problème de déploiement à détecter lors de la mise en production. Pour les versions de Laravel antérieures à 13.24, l'article renvoie à un guide séparé sur la conversion manuelle HEIC vers JPEG en PHP.
Commentaires
Pas encore de commentaire — écris le premier.
Lance la discussion
Pas de compte ni de mot de passe — saisis simplement ton adresse e-mail et nous t’envoyons un lien de connexion à usage unique. Première visite ? Tout se met en place automatiquement.
Ton évaluation sera appliquée automatiquement après ta connexion.
Vérifie ta boîte mail
Nous avons envoyé un lien de connexion à …. Ouvre-le sur cet appareil — cet onglet te connectera automatiquement.
Rien reçu ? Vérifiez le dossier spam — et marquez le message « Non spam » pour qu'il arrive directement la prochaine fois.