grav contenido, media

Multimedia

Imágenes, vídeos y audio

Al crear contenido en Grav, a menudo necesitas mostrar diferentes tipos de medios como imágenes, videos y varios archivos. Estos archivos son detectados y procesados automáticamente por Grav y están disponibles para usar en cualquier página. Esto es especialmente útil porque puedes aprovechar la funcionalidad incorporada para generar miniaturas, acceder a metadatos y modificar los medios dinámicamente (como redimensionar imágenes, ajustar el tamaño de visualización de videos, etc.) según tus necesidades.

Grav utiliza un sistema de caché inteligente que crea automáticamente copias en caché de los medios generados dinámicamente cuando es necesario. De esta manera, todas las solicitudes posteriores pueden usar la versión en caché en lugar de tener que regenerar el medio cada vez.

Archivos multimedia compatibles

Los siguientes tipos de archivos multimedia son compatibles de forma nativa con Grav. Se puede agregar soporte para otros tipos de medios e incrustaciones mediante plugins.

Tipo de Medio Formatos de Archivo
Imagen jpg, jpeg, png
Audio mp3, wav, wma, ogg, m4a, aiff, aif
Imagen animada gif
Imagen vectorizada svg
Video mp4, mov, m4v, swf, flv, webm, ogv
Datos/Información txt, doc, docx, html, htm, pdf, zip, gz, 7z, tar, css, js, json, xml, xls, xlt, xlm, xlsm, xld, xla, xlc, xlw, xll, ppt, pps, rtf, bmp, tiff, mpeg, mpg, mpe, avi, wmv

Puedes encontrar una lista completa de tipos MIME compatibles en el archivo system/config/media.yaml. Si hay un tipo MIME que no está soportado actualmente, simplemente puedes crear tu propio user/config/media.yaml y agregarlo allí. Solo asegúrate de seguir el mismo formato que el archivo original del system. El enfoque más simple es copiar todo el archivo original y hacer tus ediciones.

Dónde colocar tus archivos multimedia

Normalmente usarás un archivo multimedia dentro de una página, así que simplemente coloca el archivo en la carpeta de la página y podrás referenciarlo en el Markdown de la página, por ejemplo:

![mi imagen](imagen.jpg)

Si quieres colocar todas tus imágenes en una sola carpeta, puedes ponerlas en una carpeta user/pages/images. De esta manera, en Twig, puedes acceder a ellas mediante:

{% set mi_imagen = page.find('/images').media['mi-imagen.jpg'] %}

y también puedes encontrarlas fácilmente mediante Markdown y realizar operaciones sobre ellas:

![mi imagen](/images/mi-imagen.jpg?cropResize=300,300)

Alternativamente, puedes colocarlas en tu tema, ya que es fácilmente accesible mediante referencias CSS o desde un archivo Markdown usando el stream theme://:

![mi imagen](theme://images/imagen-del-tema.jpg)

Otra opción es user/images, donde puedes usar el stream image:// para acceder a ellas:

![mi imagen](image://mi-imagen.jpg)

De hecho, puedes usar cualquier stream incluyendo cualquier carpeta dentro de user/ mediante el stream user://:

![mi imagen](user://themes/mitema/images/mi-imagen.jpg)

También puedes hacer este tipo de cosas usando el objeto Media de Twig:

{{ media['user://themes/mitema/images/mi-imagen.jpg'].html()|raw }}

Grav tiene una carpeta /images. No coloques tus propias imágenes allí, ya que aloja imágenes generadas automáticamente por Grav en caché.

También puedes querer colocar todos los archivos multimedia en su propia carpeta, para que todos puedan ser accedidos de una vez. Por ejemplo, podrías guardar todos tus archivos MP3 en una carpeta user/pages/mp3s (no visible) y poner el nombre del archivo MP3 asociado con una página particular en un campo del encabezado llamado thistrack. Si luego deseas acceder al archivo para una página particular y reproducirlo usando el elemento de audio HTML5, necesitarás código como este:

<audio controls>
  <source src="{{ page.find('/mp3s').media[page.header.thistrack~'.mp3']|e }}">
</audio>

Modos de visualización

Grav proporciona algunos modos de visualización diferentes para cada tipo de objeto multimedia.

Modo Explicación
source Representación visual del medio en sí, es decir, la imagen, video o archivo real
text Representación textual del medio
thumbnail La imagen miniatura para este objeto multimedia

Los medios de tipo Datos/Información no soportan el modo source, por defecto usarán el modo text si no se elige explícitamente otro modo.

Ubicación de miniaturas

Grav buscará tus miniaturas en tres ubicaciones:

  1. En la misma carpeta que tu archivo multimedia: [nombre-del-medio].[extensión-del-medio].thumb.[extensión-de-miniatura] donde nombre-del-medio y extensión-del-medio son respectivamente el nombre y la extensión del archivo multimedia original y extensión-de-miniatura es cualquier extensión soportada por el tipo de medio image. Ejemplos son mi_video.mp4.thumb.jpg y mi-imagen.jpg.thumb.png ¡Solo para imágenes! La imagen misma se usará como miniatura.
  2. Tu carpeta de usuario: user/images/media/thumb-[extensión-del-medio].png donde extensión-del-medio es la extensión del archivo multimedia original. Ejemplos son thumb-mp4.png y thumb-jpg.jpg
  3. La carpeta del sistema: system/images/media/thumb-[extensión-del-medio].png donde extensión-del-medio es la extensión del archivo multimedia original. Las miniaturas en las carpetas del sistema son proporcionadas previamente por Grav.

También puedes seleccionar manualmente la miniatura deseada con las acciones explicadas más adelante.

Enlaces y Lightboxes

Los modos de visualización anteriores también se pueden usar en combinación con enlaces y lightboxes, que se explican con más detalle más adelante. Sin embargo, es importante tener en cuenta que:

Grav no proporciona funcionalidad de lightbox de forma predeterminada, necesitas un plugin para esto. Puedes usar el plugin FeatherLight para Grav para lograrlo.

Cuando usas la funcionalidad multimedia de Grav para renderizar un lightbox, todo lo que hace Grav es generar una etiqueta anchor que tiene algunos atributos para que el plugin de lightbox los lea. Si estás interesado en usar una biblioteca de lightbox que no esté en nuestro repositorio de plugins o quieres crear tu propio plugin, puedes usar la siguiente tabla como referencia.

Atributo Explicación
rel Un indicador simple de que esto no es un enlace regular, sino un enlace de lightbox. El valor siempre será lightbox.
href Una URL al objeto multimedia en sí.
data-width El ancho que el usuario solicitó para este lightbox.
data-height El alto que el usuario solicitó para este lightbox.
data-srcset En el caso de medios de imagen, esto contiene la cadena srcset. (más info)

Acciones

Grav emplea un patrón de construcción al manejar medios, por lo que puedes realizar múltiples acciones sobre un medio particular. Algunas acciones están disponibles para todo tipo de medios, mientras que otras son específicas del medio.

Generales

Estas acciones están disponibles para todos los tipos de medios.

url

Este método está destinado solo a usarse en plantillas Twig, de ahí la falta de sintaxis Markdown.

Devuelve la ruta URL sin procesar al medio.

{{ page.media['imagen-ejemplo.jpg'].url|e }}

html

En Markdown este método se llama implícitamente cuando se usa la sintaxis ![].

La acción html generará una etiqueta HTML válida para el medio basada en el modo de visualización actual.

![Texto ALT](imagen-ejemplo.jpg?classes=miclase "Mi título")

display

Usa esta acción para cambiar entre los distintos modos de visualización que proporciona Grav. Una vez que cambias el modo de visualización, todas las acciones anteriores se reiniciarán. Las excepciones a esta regla son las acciones lightbox y link y cualquier acción que se haya usado antes de esas dos.

Por ejemplo, la miniatura resultante de llamar a page.media['imagen-ejemplo.jpg'].sepia().display('thumbnail').html() no tendrá aplicada la acción sepia(), pero page.media['imagen-ejemplo.jpg'].display('thumbnail').sepia().html() sí.

Una vez que cambias al modo miniatura, estarás manipulando una imagen. Esto significa que incluso si tu medio actual es un video, puedes usar todas las acciones de tipo imagen en la miniatura.

Convierte tu objeto multimedia en un enlace. Todas las acciones que llames antes de link() se aplicarán al destino del enlace, mientras que cualquier acción llamada después se aplicará a lo que se muestra en tu página.

Después de llamar a link(), Grav cambiará automáticamente el modo de visualización a thumbnail.

El siguiente ejemplo mostrará un enlace textual (display('text')) a una versión sepia del archivo imagen-ejemplo.jpg:

![Enlace de imagen](imagen-ejemplo.jpg?sepia&link&display=text)

Solo caché

Grav se puede configurar para almacenar en caché todos los archivos de imagen, lo que puede aumentar la velocidad de entrega de los archivos. Sin embargo, las imágenes pasarán por el sistema de manipulación de imágenes de Grav, lo que puede llevar a un tamaño de archivo considerablemente mayor para imágenes que ya han sido optimizadas antes de Grav. Se puede evitar la manipulación de imágenes.

Habilita cache_all en system/config/system.yaml

images:
  default_image_quality: 85
  cache_all: false

Deshabilita la manipulación de imágenes con la opción cache.

![](imagen-ejemplo.jpg?cache)

La acción lightbox es esencialmente igual que la acción link pero con algunos extras. Como se explicó anteriormente (Enlaces y Lightboxes), la acción lightbox no hará nada más que crear un enlace con algunos atributos adicionales. Se diferencia de la acción link en que agrega un atributo rel="lightbox" y acepta atributos de width y height.

Si es posible (actualmente solo en el caso de imágenes), Grav redimensionará tu medio al ancho y alto solicitados. De lo contrario, simplemente agregará un atributo data-width y data-height al enlace.

![Imagen de ejemplo](imagen-ejemplo.jpg?lightbox=600,400&resize=200,200)
Resultado:

Imagen de ejemplo

thumbnail

Selecciona manualmente la miniatura que Grav debe usar. Puedes elegir entre page y default para cualquier tipo de medio, así como media para medios de imagen si quieres usar el objeto multimedia en sí como tu miniatura.

![Imagen de ejemplo](imagen-ejemplo.jpg?thumbnail=default&display=thumbnail)
Resultado:

Imagen de ejemplo

attribute

Esto agrega un atributo HTML adicional a la salida.

![Imagen de ejemplo](imagen-ejemplo.jpg?attribute=miAtributo,miValor)

Acciones para Imágenes

resize

El redimensionamiento hace exactamente lo que esperarías que hiciera. resize te permite crear una nueva imagen basada en el width y el height. Se mantiene la relación de aspecto y la nueva imagen contendrá áreas en blanco del color de fondo opcional proporcionado como un valor hexadecimal, por ejemplo 0xffffff. El parámetro de fondo es opcional, y si no se proporciona, por defecto será transparente si la imagen es PNG, o blanco si es JPEG.

![Imagen de ejemplo](imagen-ejemplo.jpg?resize=320,200&classes=image,border,shadow)
Resultado:

Imagen de ejemplo

forceResize

Redimensiona la imagen al width y height proporcionados. forceResize no respetará la relación de aspecto original y estirará la imagen según sea necesario para ajustarse al nuevo tamaño de imagen.

![Imagen de ejemplo](imagen-ejemplo.jpg?forceResize=200,300)
Resultado:

Imagen de ejemplo

cropResize

cropResize redimensiona una imagen a un tamaño más pequeño o más grande basado en el width y el height. Se mantiene la relación de aspecto y la nueva imagen se redimensionará para encajar en el cuadro delimitador descrito por el width y height proporcionados. En otras palabras, cualquier área de fondo que verías en un resize normal se recorta.

Por ejemplo, si tienes una imagen que es 640 x 480 y realizas una acción cropResize(100, 100) sobre ella, terminarás con una imagen de 100 x 75.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropResize=300,300)
Resultado:

Imagen de ejemplo

crop

crop no redimensionará la imagen en absoluto, solo recortará la imagen original para que solo se use la porción del cuadro delimitador descrito por el width y el height que se origina en la ubicación x e y para crear la nueva imagen.

Por ejemplo, una imagen que es 640 x 480 con crop(0, 0, 400, 100) producirá una imagen con un ancho de 400 y un alto de 100 originada en la esquina superior izquierda como se describe en 0, 0.

![Imagen de ejemplo](imagen-ejemplo.jpg?crop=100,100,300,200)
Resultado:

Imagen de ejemplo

cropZoom

Similar al cropResize regular, cropZoom también toma un width y un height pero redimensionará y recortará la imagen para asegurar que la imagen resultante tenga el tamaño exacto que solicitaste. Se mantiene la relación de aspecto pero partes de la imagen pueden recortarse, sin embargo la imagen resultante está centrada.

La principal diferencia entre cropResize y cropZoom es que en cropResize, la imagen se redimensiona manteniendo la relación de aspecto para que se muestre toda la imagen, y cualquier espacio extra se considera fondo.

Con cropZoom, la imagen se redimensiona para que no haya fondo visible, y el área extra de la imagen fuera del nuevo tamaño de imagen se recorta.

Por ejemplo, si tienes una imagen que es 640 x 480 y realizas una acción cropZoom(400, 100), la imagen resultante se redimensionará a 400 x 300 y luego se recortará el alto resultando en una imagen de 400 x 100.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=600,200&classes=image,border,shadow)

Las personas familiarizadas con usar zoomCrop para este propósito encontrarán que también funciona en Grav.

Resultado:

Imagen de ejemplo

quality

Permite establecer dinámicamente un porcentaje de compresión value para la imagen entre 0 y 100. Un número más bajo significa menor calidad, donde 100 significa calidad máxima.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&quality=25)
Resultado:

Imagen de ejemplo

negate

Aplica un filtro negativo a la imagen donde los colores se invierten.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&negate)
Resultado:

Imagen de ejemplo

brightness

Aplica un filtro de brillo a la imagen con un value de -255 a +255. Números negativos más grandes harán la imagen más oscura, mientras que números positivos más grandes la harán más brillante.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&brightness=-100)
Resultado:

Imagen de ejemplo

contrast

Esto aplica un filtro de contraste a la imagen con un value de -100 a +100. Números negativos más grandes aumentarán el contraste, mientras que números positivos más grandes lo reducirán.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&contrast=-50)

Imagen de ejemplo

grayscale

Esto procesa la imagen con un filtro de escala de grises.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&grayscale)
Resultado:

Imagen de ejemplo

emboss

Esto procesa la imagen con un filtro de relieve.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&emboss)
Resultado:

Imagen de ejemplo

smooth

Esto aplica un filtro de suavizado a la imagen basado en el valor de suavizado value desde -10 hasta 10.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&smooth=5)
Resultado:

Imagen de ejemplo

sharp

Esto aplica un filtro de enfoque en la imagen.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&sharp)
Resultado:

Imagen de ejemplo

edge

Esto aplica un filtro de detección de bordes en la imagen.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&edge)
Resultado:

Imagen de ejemplo

colorize

Puedes colorear la imagen basada en ajustar los valores de red, green, y blue para la imagen desde -255 a +255 para cada color.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&colorize=100,-100,40)
Resultado:

Imagen de ejemplo

sepia

Esto aplica un filtro sepia en la imagen para producir un aspecto vintage.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&sepia)
Resultado:

Imagen de ejemplo

gaussianBlur

Desenfoca la imagen por un Factor, que define cuántas veces se aplica el filtro de desenfoque a la imagen. Por defecto es 1 vez.

![Imagen de ejemplo](imagen-ejemplo.jpg?gaussianBlur=3)
Resultado:

Imagen de ejemplo

rotate

Rota la imagen por angle grados en sentido antihorario, valores negativos rotan en sentido horario.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&rotate=-90)
Resultado:

Imagen de ejemplo

flip

Voltea la imagen en las direcciones dadas. Ambos parámetros pueden ser 0|1. Ambos 0 equivalen a no voltear en ninguna dirección.

![Imagen de ejemplo](imagen-ejemplo.jpg?cropZoom=300,200&flip=0,1)
Resultado:

Imagen de ejemplo

fixOrientation

Corrige la orientación de la imagen cuando se realiza rotación mediante datos EXIF (se aplica a imágenes jpeg tomadas con teléfonos y cámaras).

![Imagen de ejemplo](imagen-ejemplo.jpg?fixOrientation)

watermark

La acción watermark combina dos imágenes, una imagen de marca de agua y una imagen fuente, en una imagen final con marca de agua. Esta es una acción muy específica que necesita una descripción más detallada que otras acciones o filtros. En particular, se debe tener en cuenta el comportamiento específico al combinar filtros. Para aquellos interesados, hay una publicación de blog muy detallada sobre la acción watermark, escrita por Vít Petira, pero solo en checo. Sin embargo, las instrucciones son fáciles de entender.

Si estás usando un stream a nivel de página, entonces también se deben especificar los prefijos de página.

![Imagen de ejemplo](imagen-ejemplo.jpg?watermark=user://pages/03.grav/contenido/media/marca-de-agua.png,top-left,50)
Resultado:

Imagen de ejemplo

loading

El atributo loading en imágenes permite a los autores controlar cuándo el navegador debe comenzar a cargar el recurso. El valor para el atributo loading puede ser uno de auto (predeterminado), lazy, eager. El valor se puede establecer en system.images.defaults.loading como valor predeterminado, o por imagen md con ?loading=lazy Cuando se elige el valor auto, no se agrega ningún atributo loading y el navegador determinará qué estrategia usar.

![Imagen de ejemplo](imagen-ejemplo.jpg?loading=lazy)

decoding

El atributo decoding en imágenes permite a los autores controlar cuándo el navegador debe comenzar a decodificar el recurso. El valor para el atributo decoding puede ser uno de auto (predeterminado), sync, async. El valor se puede establecer en system.images.defaults.decoding como valor predeterminado, o por imagen md con ?decoding=async Cuando se elige el valor auto, no se agrega ningún atributo decoding y el navegador determinará qué estrategia usar.

![Imagen de ejemplo](imagen-ejemplo.jpg?decoding=async)

fetchpriority

El atributo fetchpriority permite a los autores controlar cuándo el navegador debe priorizar la obtención de la imagen en relación con otras imágenes. El valor para el atributo fetchpriority puede ser uno de auto (predeterminado), high, low. El valor se puede establecer en system.images.defaults.fetchpriority como valor predeterminado, o por imagen md con ?fetchpriority=high Cuando se elige el valor auto, no se agrega ningún atributo fetchpriority y el navegador determinará qué estrategia usar.

![Imagen de ejemplo](imagen-ejemplo.jpg?fetchpriority=high)

Acciones para Imágenes Animadas/Vectorizadas

resize

Debido a que PHP no puede manejar el redimensionamiento dinámico de estos tipos de medios, la acción resize solo se asegurará de que se establezcan los atributos width y height o data-width y data-height en tu etiqueta <img>/<video> o <a> respectivamente. Esto significa que tu imagen o video se mostrará en el tamaño solicitado, pero el archivo de imagen o video real no se convertirá de ninguna manera.

![Tráiler de ejemplo](trailer-ejemplo.mov?resize=400,200)

ejemplos

Algunos ejemplos de esto:

![Vector de ejemplo](vector-imagen.svg?resize=300,300)

Acciones para Audio

Los medios de audio mostrarán un enlace de audio HTML5:

![Hal 9000: Lo siento Dave](hal9000.mp3)
Resultado:

controls

Permite establecer o eliminar explícitamente los controles predeterminados de HTML5. Pasar 0 oculta los controles del navegador para reproducción, volumen, etc.

![Hal 9000: Lo siento Dave](hal9000.mp3?controls=0)

preload

Permite establecer la propiedad preload, que por defecto es auto. Los parámetros permitidos son auto, metadata, y none.

Si no se establece, su valor predeterminado está definido por el navegador (es decir, cada navegador puede tener su propio valor predeterminado). La especificación recomienda que se establezca en metadata.

El atributo preload se ignora si autoplay está presente.

![Hal 9000: Lo siento Dave](hal9000.mp3?preload=metadata)

autoplay

Permite establecer si el audio se reproducirá automáticamente (autoplay) al cargar la página. Por defecto es false si no se establece.

Si autoplay y preload están presentes en un elemento audio dado, preload se ignorará.

![Hal 9000: Lo siento Dave](hal9000.mp3?autoplay=1)

controlsList

Permite establecer la propiedad controlsList, que acepta uno o más de tres valores posibles: nodownload, nofullscreen, y noremoteplayback.

Si estableces más de un parámetro en markdown, separa cada uno con un guión (-). Estos serán reemplazados por espacios en el HTML de salida.

![Hal 9000: Lo siento Dave](hal9000.mp3?controlsList=nodownload-nofullscreen-noremoteplayback)

muted

Permite establecer si el audio está silenciado (muted) al cargar. Por defecto es false si no se establece.

![Hal 9000: Lo siento Dave](hal9000.mp3?muted=1)

loop

Permite establecer si el audio se repetirá (loop) al reproducirse hasta completarse. Por defecto es false si no se establece.

![Hal 9000: Lo siento Dave](hal9000.mp3?loop=1)

Acciones para Archivos

Grav no proporciona ninguna acción personalizada en archivos en este momento y no hay planes de agregar ninguna. Si se te ocurre algo, por favor contáctanos.

[Ver Archivo de Texto](acronimos.txt)
Resultado:

Ver Archivo de Texto

Combinaciones

Como puedes ver: ¡Grav proporciona una funcionalidad de manipulación de imágenes potente que hace que sea realmente fácil trabajar con imágenes! El verdadero poder viene cuando combinas múltiples efectos y produces algunas manipulaciones de imágenes dinámicas muy sofisticadas. Por ejemplo, esto es totalmente válido:

![Imagen de ejemplo](imagen-ejemplo.jpg?negate&lightbox&cropZoom=200,200)
Resultado:

Imagen de ejemplo

Reiniciando múltiples llamadas a la misma imagen

Cuando accedes a la misma imagen múltiples veces en una sola página, las acciones que has proporcionado a la imagen no se reinician por defecto. Así que si redimensionas una imagen y generas el HTML, y luego más adelante en la misma página simplemente generas la URL de la imagen, también obtendrás la URL de la imagen redimensionada. Probablemente esperabas la URL de la imagen original.

Para combatir esto, puedes reiniciar las acciones en las imágenes pasando false al método url():

{% for item in page.header.gallery %}
    {% set image = page.media[item.src].cropZoom(800, 600).quality(70) %}
    <a href="{{ image.url(false)|e }}">
      <img src="{{ image.url|e }}" alt="{{ item.alt|e }}" title="{{ item.title|e }}" />
    </a>
{% endfor %}

Imágenes responsivas

Pantallas de mayor densidad

Grav tiene soporte incorporado para imágenes responsivas para pantallas de mayor densidad (por ejemplo, pantallas Retina). Grav logra esto implementando srcset de la propuesta de elemento Picture HTML. Un buen artículo para leer si quieres entender esto mejor es esta publicación de blog de Eric Portis.

Grav establece el argumento sizes mencionado en las publicaciones anteriores al ancho completo del viewport por defecto. Usa la acción sizes mostrada a continuación para elegir tú mismo.

Para comenzar a usar imágenes responsivas, todo lo que necesitas hacer es agregar imágenes de mayor densidad a tus páginas agregando un sufijo al nombre del archivo. Si solo proporcionas imágenes de mayor densidad, Grav generará automáticamente versiones de menor calidad para ti. El nombrado funciona de la siguiente manera: [nombre-imagen]@[ratio-densidad]x.[extensión-imagen], así que por ejemplo agregar imagen-ejemplo@3x.jpg a tu página resultará en que Grav cree una versión 2x y una 1x (tamaño regular) por defecto.

Estos archivos generados por Grav se almacenarán en la carpeta de caché images/, no en tu carpeta de página.

Supongamos que tienes un archivo llamado retina@2x.jpg, en realidad harías referencia a este en tus enlaces como retina.jpg, y luego Grav no encontrará esta imagen y comenzará a buscar tamaños de imagen retina. Encontrará retina@2x.jpg y luego se dará cuenta de que necesita hacer una variante @1x y mostrar la salida srcset apropiada:

![Imagen Retina](retina.jpg?sizes=80vw)
Resultado:

Imagen Retina

Dependiendo de tu pantalla y la implementación y soporte de srcset de tu navegador, es posible que nunca veas una diferencia. Incluimos el marcado HTML en la tercera pestaña para que puedas ver lo que sucede detrás de escena.

Tamaños con consultas de medios

Grav también tiene soporte para consultas de medios dentro del atributo sizes, lo que te permite usar diferentes anchos dependiendo del tamaño de pantalla del dispositivo. A diferencia del primer método, no tienes que crear múltiples imágenes; se crearán automáticamente. La imagen de respaldo es la imagen actual, por lo que un navegador sin soporte para srcset mostrará la imagen original.

![Imagen Retina](retina.jpg?sizes=%28max-width%3A26em%29+100vw%2C+50vw)
Resultado:

Imagen Retina

Dependiendo de tu pantalla y la implementación y soporte de srcset de tu navegador, es posible que nunca veas una diferencia. Incluimos el marcado HTML en la cuarta pestaña para que puedas ver lo que sucede detrás de escena.

Tamaños con consultas de medios usando derivados

Si deseas personalizar los tamaños de los archivos creados automáticamente, puedes usar el método derivatives() (como se muestra a continuación). El primer parámetro es el ancho de la más pequeña de las imágenes generadas. El segundo es el ancho máximo (exclusivo) de las imágenes generadas. El tercer y único parámetro opcional dicta los intervalos con los que generar las fotos (por defecto es 200). Por ejemplo, si estableces el primer parámetro en 320 y el tercero en 100, Grav generará una imagen para 320, 420, 520, 620, y así sucesivamente hasta que alcance su máximo establecido.

En nuestro ejemplo, establecemos el máximo en 1600. Esto resultará en incrementos de 300 desde 320 hasta 1520 ya que 1620 estaría por encima del umbral.

Por el momento no funciona dentro de markdown, solo en tus archivos twig.

![Imagen Retina](retina.jpg?derivatives=320,1600,300&sizes=%28max-width%3A26em%29+100vw%2C+50vw)
Resultado:

Imagen Retina

Dependiendo de tu pantalla y la implementación y soporte de srcset de tu navegador, es posible que nunca veas una diferencia. Incluimos el marcado HTML en la cuarta pestaña para que puedas ver lo que sucede detrás de escena.

Definición manual de tamaños

En lugar de dejar que Grav genere los tamaños en pasos pares entre límites dados, puedes definir manualmente qué tamaños debe generar Grav:

![Imagen Retina](retina.jpg?derivatives=[360,720,1200])

Esto generará versiones reducidas de la imagen retina.jpg en tres anchos: 360, 720 y 1200px.

Metaarchivos

Cada medio que referencias en Grav, por ejemplo imagen1.jpg, trailer-ejemplo.mov, o incluso archivo.zip tiene la capacidad de tener variables establecidas o incluso sobrescritas mediante un metaarchivo. Estos archivos tienen el formato <nombre-archivo>.meta.yaml. Por ejemplo, para una imagen con el nombre de archivo imagen1.jpg podrías crear un metaarchivo llamado imagen1.jpg.meta.yaml.

Puedes agregar casi cualquier configuración o pieza de metadatos que desees usando este método.

El contenido de este archivo debe estar en sintaxis YAML, un ejemplo podría ser:

image:
    filters:
        default:
            - [cropResize, 300, 300]
            - sharp
alt_text: Mi Texto ALT

Si estás usando este método para agregar estilos específicos del archivo o metaetiquetas para un solo archivo, querrás colocar el archivo YAML en la misma carpeta que el archivo referenciado. Esto asegurará que el archivo se incluya junto con los datos YAML. Es una forma práctica de establecer incluso metadatos específicos del archivo ya que no puedes hacerlo desde la página misma.

Digamos que solo quieres extraer el valor alt_text listado para el archivo de imagen imagen-ejemplo.jpg. Entonces crearías un archivo llamado imagen-ejemplo.jpg.meta.yaml y lo colocarías en la carpeta con el archivo de imagen referenciado. Luego, inserta los datos usados en el ejemplo anterior y guarda ese archivo YAML. En el archivo markdown de la página, puedes mostrar estos datos usando la siguiente línea:

{{ page.media['imagen-ejemplo.jpg'].meta.alt_text|e }}

Esto mostrará la frase de ejemplo Mi Texto ALT en lugar de la imagen. Este es solo un ejemplo básico. Puedes usar este método para varias cosas, incluyendo crear una galería con múltiples puntos de datos únicos que deseas tener referenciados para cada imagen. Tus imágenes, en esencia, tienen un conjunto de datos únicos para ellas que pueden ser fácilmente referenciados y extraídos según sea necesario.

Opciones de Video

Las opciones de control de video en línea son otra capacidad integrada en Grav. Estas opciones, agregadas en línea con el nombre del archivo, te dan la capacidad de determinar los ajustes autoplay, controls, y loop de un video incrustado.

Aquí hay un ejemplo:

![video.mov](video.mov?loop=1&controls=0&autoplay=1&muted)

Las opciones son las siguientes:

Atributo Explicación
autoplay Habilita (1) o Deshabilita (0) la reproducción automática del video al cargar la página.
controls Habilita (1) o Deshabilita (0) los controles de medios para el video incrustado.
loop Habilita (1) o Deshabilita (0) el bucle automático para el video, reproduciéndolo nuevamente cuando termina.
muted Silencia el video y generalmente permite que se reproduzca automáticamente.