Los iPhone capturan en HEIC por defecto —aproximadamente la mitad del tamaño de un JPEG equivalente—, pero Chrome y Firefox no pueden mostrar ese formato. Hasta hace poco, el componente de imágenes de Laravel rechazaba los archivos HEIC antes de que llegaran al driver. Laravel 13.24 lo cambia: acepta HEIC, HEIF y AVIF como entrada, añade toHeic() para la salida y enseña los tres formatos a la regla de validación image. El soporte fue aportado por @riasvdv (PR #60922).

En el servidor, la decodificación HEIC requiere la extensión Imagick compilada con el delegado HEIF de ImageMagick (basado en libheif); GD no puede leer HEIC en absoluto. Muchos paquetes de distribución incluyen ImageMagick sin ese delegado, así que conviene verificarlo con php -r "print_r(Imagick::queryFormats('HEI*'));" — un array vacío significa que la extensión no puede procesar esos archivos. En Debian/Ubuntu el delegado está en libheif1; la fórmula de Homebrew imagemagick lo incluye. AVIF es más sencillo, ya que GD puede decodificarlo si PHP se compiló contra libavif. Intervention Image (^4.0) respalda ambos drivers.

La validación no requiere configuración: la regla image ahora reconoce heic, heif y avif, de modo que una foto subida directamente desde un iPhone pasa donde antes fallaba. La regla mimes (p. ej. mimes:jpg,png,webp,heic) también funciona; ambas determinan el tipo a partir del contenido del archivo en lugar del tipo MIME declarado por el navegador, que en HEIC varía entre image/heic, image/heif y otros.

Como los navegadores no pueden mostrar los HEIC almacenados, la conversión debe hacerse durante la subida: $request->image('photo')->usingImagick()->orient()->scale(width: 2000)->toWebp()->quality(80)->store('photos'). usingImagick() es necesario porque el driver GD por defecto falla con HEIC, y orient() aplica los metadatos de rotación habituales en fotos de móvil. store() genera un nombre de archivo hasheado con la extensión correcta, de modo que la subida convertida queda como photos/{hash}.webp.

Para servir AVIF con respaldo WebP, se generan ambas variantes desde una misma fuente preparada —cada transformación devuelve una nueva instancia, sin fugas de estado— y el navegador elige mediante un elemento <picture> con un <source> AVIF. AVIF suele ser entre un 20 y un 30 % más pequeño que WebP con calidad comparable, pero codifica más lento; al generar varios tamaños conviene usar un job en cola.

También es posible escribir HEIC mediante toHeic() u optimize('heic'), útil para archivos o exportaciones destinados a dispositivos Apple. El alias heif se normaliza a HEIC en todas partes: los archivos se guardan con la extensión canónica .heic y mimeType() reporta image/heic. Image::extension() además mapea correctamente los alias image/x-heic y image/x-avif.

Los formatos no soportados que llegan al driver lanzan una ImageException con el tipo implicado (p. ej. "The image format [image/tiff] is not supported."). La misma excepción aparece cuando un HEIC llega a un build de Imagick sin el delegado HEIF — un problema de despliegue que conviene detectar durante el release. Para versiones de Laravel anteriores a 13.24, el artículo remite a una guía aparte sobre conversión manual de HEIC a JPEG en PHP.