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.
Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.