La API de imágenes first-party de Laravel cubría la escritura desde la 13.20 — subida, transformación y almacenamiento en un disco —, pero servir una imagen redimensionada por HTTP exigía código repetitivo: llamar a toBytes(), construir la respuesta y fijar el content-type a mano. Laravel 13.25 lo resuelve con tres novedades.

Primero, Image ahora implementa el contrato Responsable: una instancia de imagen es un valor de retorno válido desde una ruta o controlador. El framework llama a toResponse(), ejecuta el pipeline de forma perezosa, devuelve los bytes con un 200 y fija el Content-Type según la salida producida — un JPEG almacenado pero servido como WebP devuelve correctamente image/webp. Al ser perezosa, la transformación solo se ejecuta cuando realmente se piden los bytes.

La respuesta por defecto no incluye cabeceras de caché. Llamar a toResponse($request) manualmente devuelve una Illuminate\Http\Response, con lo que setMaxAge(), setPublic(), setEtag() y el resto de la API quedan disponibles. Para tráfico real, el artículo recomienda generar el archivo derivado una sola vez y servirlo después desde el disco, incluyendo el timestamp updated_at del modelo en el nombre del archivo para que las fotos actualizadas generen nuevas rutas sin invalidar caché.

Segundo, toFormat() ahora es público y acepta directamente webp, jpg, jpeg, png, gif, avif, heic, heif (normalizado a heic) y bmp — se acabaron los bloques match para formatos provenientes de la petición. Un valor inválido lanza una ImageException (un 500, no un 404), por lo que se aconsejan restricciones de ruta o validación. Esto hace muy cortos los endpoints AVIF con fallback junto al elemento <picture>.

Tercero, Image::fromStream() crea una instancia desde un recurso stream, por ejemplo Storage::disk('s3')->readStream($path). La lectura es perezosa; un stream vacío lanza «Invalid stream image data.» al ejecutarse el pipeline. El método complementa fromPath(), fromStorage(), fromUpload(), fromUrl(), fromBytes() y fromBase64() para handles como php://input o archivos leídos desde archivos comprimidos.

El artículo cierra con un endpoint completo: ancho validado (limitado entre 32 y 2000) y formato, lectura en stream desde S3, escalado, conversión, calidad 80 y caché pública de un año — todo protegido con una ruta firmada para impedir que alguien genere variantes arbitrarias a costa de tu factura de almacenamiento. Los tres cambios fueron contribuidos por Caleb White en los PR #61111, #61109 y #61110 del framework.