Especificación del contenedor WebP

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Introducción

WebP es un formato de imagen que usa (i) la codificación de fotogramas clave VP8 para comprimir los datos de imágenes con pérdida o (ii) la codificación sin pérdidas de WebP (y, posiblemente, otras codificaciones en el futuro). Estos esquemas de codificación deberían hacerla más eficiente que los formatos que se usan actualmente. Está optimizado para lograr una transferencia de imágenes rápida a través de la red (p.ej., para sitios web). El formato WebP también tiene paridad de funciones (perfil de color, metadatos, animación, etc.) con otros formatos. En este documento, se describe la estructura de un archivo WebP.

El contenedor WebP (es decir, El contenedor de RIFF para WebP) permite la compatibilidad de funciones por encima y por encima del caso de uso básico de WebP (es decir, un archivo que contiene una sola imagen codificada como un fotograma clave de VP8). El contenedor WebP proporciona compatibilidad adicional con lo siguiente:

  • Compresión sin pérdida: Una imagen se puede comprimir sin pérdidas mediante el formato sin pérdida de WebP.

  • Metadatos. Una imagen puede tener metadatos almacenados en formato Exif o XMP.

  • Transparencia. Una imagen puede tener transparencia, es decir, un canal alfa.

  • Perfil de color. Una imagen puede tener un perfil de ICC incorporado como se describe en el International Color Consortium.

  • Animación. Una imagen puede tener varios marcos con pausas entre ellos, lo que la convierte en una animación.

Las palabras clave “DEBE”, “NO DEBE”, “OBLIGATORIO”, “DEJAR”, “NO DEBE”, “NO DEBERÍA”, “NO DEBERÍA”, “RECOMENDADO”, “NO SE RECOMIENDA”, “MAYO” y “OPCIONAL” en este documento se deben interpretar como se describe en el archivo CP 14 RFC 2119 RFC 8174: como aparecen, como en el momento y en el momento

La numeración de bits en los diagramas de fragmentos comienza en 0 para el bit más significativo ("MSB 0") como se describe en RFC 1166.

Asignación de nombres

Te recomendamos que uses los siguientes tipos para hacer referencia al contenedor WebP:

Nombre del formato del contenedorWebP
Extensión del nombre del archivo.webp
Tipo MIMEimagen/webp
Identificador de tipo uniformeorg.webmproject.webp

Terminología y conceptos básicos

Un archivo WebP contiene una imagen estática (es decir, una matriz codificada de píxeles) o una animación. De manera opcional, también puede contener información de transparencia, perfil de color y metadatos. En caso de que solo debamos hacer referencia a la matriz de píxeles, la llamaremos lienzo de la imagen.

A continuación, se indican los términos adicionales usados en este documento:

Lector/Escritor
El código que lee archivos WebP se conoce como lector, mientras que el código que los escribe se conoce como escritor.
uint16
Es un número entero de 16 bits, tipo little-endian y sin firma.
uint24
Un número entero de 24 bits, little-endian, sin firma.
uint32
Es un número entero pequeño, sin firmar y de 32 bits.
FourCC
Un FourCC (código de cuatro caracteres) es un uint32 creado mediante la concatenación de cuatro caracteres ASCII en orden de little-endian. Esto significa que "aaaa" (0x61616161) y "AAAA" (0x41414141) se tratan como FourCCs diferentes.
Basado en 1
Campo de números enteros sin firma que almacena los valores desplazados por -1. P. ej., Tal campo almacenaría el valor 25 como 24.
ChunkHeader('ABCD')
Se usa para describir el encabezado FourCC y Chunk Size de fragmentos individuales, en el que “ABCD” es el FourCC para el fragmento. El tamaño de este elemento es de 8 bytes.

Formato de archivo RIFF

El formato de archivo WebP se basa en el formato de documento RIFF (Resource Interchange File Format).

El elemento básico de un archivo RIFF es un fragmento. Consta de los siguientes elementos:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Chunk FourCC                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Chunk Size                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                         Chunk Payload                         :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Fragmento FourCC: 32 bits
Código ASCII de cuatro caracteres que se usa para la identificación del fragmento.
Tamaño del fragmento: 32 bits (uint32)
Es el tamaño del fragmento en bytes, sin incluir este campo, el identificador de fragmento o el padding.
Carga útil del fragmento: Bytes del tamaño del fragmento
La carga útil de datos. Si el Tamaño del fragmento es impar, se agrega un solo byte con relleno, que DEBE ser 0 para cumplir con RIFF.

Nota: RIFF tiene una convención de que los FourCC con fragmentos FourCC en mayúsculas son fragmentos estándar que se aplican a cualquier formato de archivo RIFF, mientras que los FourCC específicos de un formato de archivo están en minúsculas. WebP no cumple con esta convención.

Encabezado del archivo WebP

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      'R'      |      'I'      |      'F'      |      'F'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           File Size                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      'W'      |      'E'      |      'B'      |      'P'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
“RIFF”: 32 bits
Los caracteres ASCII “R”, “I”, “F” y “F”.
Tamaño del archivo: 32 bits (uint32)
Tamaño del archivo en bytes que comienza en el desplazamiento 8. El valor máximo de este campo es de 2^32 menos 10 bytes y, por lo tanto, el tamaño completo del archivo es de 4 GiB como máximo, menos 2 bytes.
"WEBP": 32 bits
Los caracteres ASCII "W", "E", "B" y "P".

Un archivo WebP DEBE comenzar con un encabezado RIFF con FourCC 'WEBP'. El tamaño de archivo en el encabezado es el tamaño total de los fragmentos que siguen, más 4 bytes para el FourCC “WEBP”. El archivo NO DEBE contener datos después de los datos especificados por el tamaño de archivo. Los lectores PUEDEN analizar esos archivos, sin tener en cuenta los datos finales. Como el tamaño de cualquier fragmento es par, el tamaño proporcionado por el encabezado RIFF es par. El contenido de los fragmentos individuales se describe en las siguientes secciones.

Formato de archivo simple (con pérdida)

Este diseño se DEBE usar si la imagen requiere codificación con pérdida y no requiere transparencia ni otras funciones avanzadas que proporciona el formato extendido. Los archivos con este diseño son más pequeños y compatibles con software anterior.

Formato de archivo WebP (con pérdida) simple:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                    WebP file header (12 bytes)                |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                          VP8 chunk                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Fragmento de VP8:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('VP8 ')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                           VP8 data                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Datos de VP8: Tamaño del fragmento
Datos de flujo de bits VP8.

Observe que el cuarto carácter del "VP8" FourCC es un espacio ASCII (0x20).

Puedes encontrar la especificación del formato de flujo de bits de VP8 en la guía de decodificación y formato de datos VP8. Ten en cuenta que el encabezado del marco VP8 contiene el ancho y la altura. Se supone que es el ancho y la altura del lienzo.

En la especificación de VP8, se describe cómo decodificar la imagen en formato Y'CbCr. Para convertir a RGB, se debe usar Rec. 601. Las aplicaciones PUEDEN usar otro método de conversión, pero los resultados visuales pueden variar entre los decodificadores.

Formato de archivo simple (sin pérdida)

Nota: Es posible que los lectores más antiguos no admitan archivos con el formato sin pérdida de datos.

Este diseño DEBE utilizar si la imagen requiere codificación sin pérdida (con un canal de transparencia opcional) y no requiere características avanzadas proporcionadas por el formato extendido.

Formato de archivo WebP (sin pérdida) simple:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                    WebP file header (12 bytes)                |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                          VP8L chunk                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Fragmento de VP8L:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('VP8L')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                           VP8L data                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Datos de VP8L: Bytes de tamaño de Chunk
Datos de flujo de bits VP8L.

La especificación actual del flujo de bits VP8L se puede encontrar en formato de flujo de bits sin pérdida de WebP. Ten en cuenta que el encabezado VP8L contiene el ancho y la altura de la imagen VP8L. Se supone que es el ancho y la altura del lienzo.

Formato de archivo extendido

Nota: Es posible que los lectores más antiguos no admitan archivos con el formato extendido.

Un archivo de formato extendido consiste en lo siguiente:

  • Un fragmento "VP8X" con información sobre las funciones que se usan en el archivo.

  • Un fragmento "ICCP" opcional con perfil de color.

  • Un fragmento opcional de "ANIM" con datos de control de animación.

  • Datos de imágenes

  • Un fragmento opcional "EXIF" con metadatos Exif.

  • Un fragmento opcional "XMP" con metadatos XMP.

  • Una lista opcional de fragmentos desconocidos

En el caso de una imagen fija, los datos de imagen consisten en un solo marco, que se compone de lo siguiente:

En el caso de una imagen animada, los datos de la imagen constan de varios marcos. Puedes encontrar más información sobre los fotogramas en la sección Animación.

Todos los fragmentos DEBEN colocarse en el mismo orden que el anterior. Si un fragmento aparece en el lugar equivocado, el archivo no es válido, pero los lectores PUEDEN analizarlo, ignorando los fragmentos que están desordenados.

Razón: Configurar el orden de los fragmentos debería permitir un análisis más rápido de los archivos. Por ejemplo, si un fragmento "ALPH" no aparece en su posición requerida, un decodificador puede optar por dejar de buscarlo. La regla de ignorar los fragmentos tardíos debe permitir que los programas que necesitan realizar una búsqueda completa proporcionen los mismos resultados que los que se detienen antes.

Encabezado de archivo WebP extendido:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                   WebP file header (12 bytes)                 |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('VP8X')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv|I|L|E|X|A|R|                   Reserved                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Canvas Width Minus One               |             ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...  Canvas Height Minus One    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Reservado (RSV): 2 bits
DEBE ser 0. Los lectores DEBEN ignorar este campo.
Perfil de ICC (I): 1 bit
Configura si el archivo contiene un perfil de ICC.
Alfa (L): 1 bit
Configura si alguno de los marcos de la imagen contiene información de transparencia (“alfa”).
Metadatos EXIF (E): 1 bit
Configura esta opción si el archivo contiene metadatos EXIF.
Metadatos de XMP (X): 1 bit
Configura si el archivo contiene metadatos XMP.
Animación (A): 1 bit
Configura si se trata de una imagen animada. Los datos en los fragmentos "ANIM" y "ANMF" deben usarse para controlar la animación.
Reservado (R): 1 bit
DEBE ser 0. Los lectores DEBEN ignorar este campo.
Reservado: 24 bits
DEBE ser 0. Los lectores DEBEN ignorar este campo.
Ancho del lienzo en adelante menos uno: 24 bits
Ancho del lienzo en píxeles basado en 1. El ancho real del lienzo es de 1 + Canvas Width Minus One.
Altura del lienzo en uno menos: 24 bits
Altura en píxeles del lienzo sobre 1. La altura real del lienzo es de 1 + Canvas Height Minus One.

El producto de Canvas Width y Canvas Height DEBE ser como máximo 2^32 - 1.

Las especificaciones futuras pueden agregar más campos. Los campos desconocidos DEBEN ignorarse.

Animación

Una animación se controla mediante fragmentos de ANIM y ANMF.

ANIMADO:

En el caso de una imagen animada, este fragmento contiene los parámetros globales de la animación.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ANIM')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Background Color                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Loop Count           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Color de fondo: 32 bits (uint32)
El color de fondo predeterminado del lienzo en orden de bytes [azul, verde, rojo y alfa]. Este color PUEDE usarse para llenar el espacio sin usar en el lienzo alrededor de los marcos, así como los píxeles transparentes del primer marco. El color de fondo también se usa cuando el método de eliminación es 1.

Nota:

  • El color de fondo PUEDE contener un valor Alfa no opaco, incluso si la marca Alpha en el fragmento VP8X no está configurada.

  • Las aplicaciones de visor DEBEN tratar la pista de color de fondo como una sugerencia y no es obligatorio usarlas.

  • El lienzo se borra al comienzo de cada bucle. Se puede usar el color de fondo para lograr esto.

Recuento de bucles: 16 bits (uint16)
Corresponde a la cantidad de veces que se repite la animación en bucle. 0 significa infinitamente.

Este fragmento DEBE aparecer si está configurada la marca Animation en el fragmento VP8X. Si la marca Animation no está configurada y este fragmento está presente, DEBE ignorarse.

Fragmento de ANMF:

En el caso de las imágenes animadas, este fragmento contiene información sobre un solo marco. Si no se establece la marca de animación, este fragmento NO DEBE estar presente.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ANMF')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Frame X                |             ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...          Frame Y            |   Frame Width Minus One     ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...             |           Frame Height Minus One              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Frame Duration                |  Reserved |B|D|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                         Frame Data                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Marco X: 24 bits (uint24)
La coordenada X de la esquina superior izquierda del marco es Frame X * 2.
Marco Y: 24 bits (uint24)
La coordenada Y de la esquina superior izquierda del marco es Frame Y * 2.
Ancho del marco menos uno: 24 bits (uint24)
El ancho del marco basado en 1. El ancho del marco es 1 + Frame Width Minus One.
Altura del marco menos uno: 24 bits (uint24)
Altura del marco basada en 1. La altura del marco es 1 + Frame Height Minus One.
Duración del marco: 24 bits (uint24)
Es el tiempo de espera, antes de mostrar el siguiente fotograma, en unidades de 1 milisegundo. Ten en cuenta que la interpretación de la duración de fotogramas de 0 (y, a menudo, <= 10) se define mediante la implementación. Muchas herramientas y navegadores asignan una duración mínima similar a la de los GIF.
Reservado: 6 bits
DEBE ser 0. Los lectores DEBEN ignorar este campo.
Método de fusión (B): 1 bit

Indica qué tan transparentes se deben combinar los píxeles transparentes del marco actual con los píxeles correspondientes del lienzo anterior:

  • 0: Usa la combinación alfa. Después de desechar el marco anterior, renderiza el marco actual en el lienzo con la combinación alfa (ver a continuación). Si el marco actual no tiene un canal alfa, supone un valor alfa de 255, que reemplaza eficazmente el rectángulo.

  • 1: No se debe mezclar. Después de deshacerte del fotograma anterior, renderiza el marco actual en el lienzo reemplazando el rectángulo cubierto por el marco actual.

Método de eliminación (D): 1 bit

Indica cómo se debe tratar el fotograma actual después de que se haya mostrado (antes de procesar el siguiente fotograma) en el lienzo:

  • 0: No deseche. No modifiques el lienzo.

  • 1: Desecha al color de fondo. Rellena el rectángulo del lienzo que cubre el marco actual con el color de fondo especificado en el fragmento ANIM.

Notas:

  • La eliminación del marco solo se aplica al rectángulo del marco, es decir, el rectángulo definido por el marco X, el marco Y, el ancho del marco y la altura del marco. Puede o no cubrir todo el lienzo.

  • Combinación alfa:

    Dado que cada uno de los canales R, G, B y A es de 8 bits, y los canales RGB no se multiplican previamente por Alfa, la fórmula para combinar "dst" con "src" es la siguiente:

    blend.A = src.A + dst.A * (1 - src.A / 255)
    if blend.A = 0 then
      blend.RGB = 0
    else
      blend.RGB =
          (src.RGB * src.A +
           dst.RGB * dst.A * (1 - src.A / 255)) / blend.A
    
  • La fusión alfa se DEBE hacer en un espacio de color lineal, teniendo en cuenta el perfil de color de la imagen. Si el perfil de color no está presente, se debe suponer que es sRGB. (Ten en cuenta que sRGB también debe ser linealizado debido a un gamma de ~2.2).

Datos del marco: Tamaño del fragmento: 16 bytes

Consiste en:

Nota: La carga útil “ANMF”, Datos de marcos, está formada por fragmentos individuales con padding descritos por el formato de archivo RIFF.

Alfa

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ALPH')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv| P | F | C |     Alpha Bitstream...                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Reservado (RSV): 2 bits
DEBE ser 0. Los lectores DEBEN ignorar este campo.
Procesamiento previo (P): 2 bits

Estos bits informativos se usan para indicar el procesamiento previo que se realizó durante la compresión. El decodificador puede usar esta información para p.ej., interpolar los valores o suavizar los gradientes antes de la visualización.

  • 0: sin procesamiento previo.
  • 1: Reducción de nivel.
Método de filtro (F): 2 bits.

El método de filtro utilizado:

  • 0: Ninguna
  • 1: Filtro horizontal.
  • 2: Filtro vertical.
  • 3: Filtro de gradientes.

Para cada píxel, se filtra mediante los siguientes cálculos. Supongamos que los valores alfa que rodean la posición X actual están etiquetados como:

 C | B |
---+---+
 A | X |

Buscamos calcular el valor alfa en la posición X. Primero, se realiza una predicción según el método de filtrado:

  • Método 0: predictor = 0
  • Método 1: predictor = A
  • Método 2: predictor = B
  • Método 3: Predictor = clip(A + B - C)

donde clip(v) es igual a:

  • 0 si v < 0
  • 255 si v > 255
  • v de lo contrario

El valor final se deriva mediante la adición del valor X descomprimido al predictor y el uso de la aritmética módulo-256 para unir el rango [256..511] en uno [0.255]:

alpha = (predictor + X) % 256

Existen casos especiales para las posiciones de píxeles superiores y de izquierda:

  • El valor superior izquierdo en la ubicación (0, 0) usa 0 como valor predictivo. De lo contrario,
  • Para los métodos de filtrado horizontal o de gradientes, se predice que los píxeles de la izquierda de la ubicación (0, y) usan la ubicación (0, y-1) justo arriba.
  • Para los métodos de filtrado vertical o de gradiente, se predice que los píxeles de la parte superior de la ubicación (x, 0) usan la ubicación (x-1, 0) a la izquierda.

No se requiere que los decodificadores usen esta información de ninguna manera especificada.

Método de compresión (C): 2 bits.

El método de compresión utilizado:

  • 0: Sin compresión.
  • 1: Se comprime mediante el formato WebP sin pérdida.
Flujo de bits alfa: Tamaño del fragmento: 1 bytes

Flujo de bits alfa codificado.

Este fragmento opcional contiene datos alfa codificados para este marco. Un marco que contiene un fragmento "VP8L" NO DEBE contener este fragmento.

Razón: La información de transparencia ya forma parte del fragmento "VP8L".

Los datos del canal alfa se almacenan como datos sin procesar sin comprimir (cuando el método de compresión es "0") o se comprimen con el formato sin pérdida (cuando el método de compresión es "1").

  • Datos sin procesar: Consisten en una secuencia de bytes de longitud * altura *, que contiene todos los valores de transparencia de 8 bits en orden de análisis.

  • Compresión de formato sin pérdida: la secuencia de bytes es una transmisión de imágenes comprimida (como se describe en el Formato de flujo de bits WebP sin pérdida) de ancho y altura de dimensión implícita. Es decir, este flujo de imágenes NO contiene ningún encabezado que describa la dimensión de la imagen.

    Razón: La dimensión ya es conocida por otras fuentes, por lo que almacenarla de nuevo sería redundante y propensa a errores.

    Una vez que la imagen se decodifica en valores de color ARGB y se sigue el proceso descrito en la especificación de formato sin pérdida, la información de transparencia se debe extraer del canal verde del cuadrupto ARGB.

    Razón: En la especificación, el canal verde admite pasos de transformación adicionales, a diferencia de los otros canales, que pueden mejorar la compresión.

Bitstream (VP8/VP8L)

Este fragmento contiene datos de flujo de bits comprimidos para un solo fotograma.

Un fragmento de transmisión continua puede ser (i) un fragmento VP8, con el prefijo "VP8" (ten en cuenta el espacio significativo de cuatro caracteres) como su etiqueta o (ii) un fragmento VP8L que use el prefijo "VP8L".

Los formatos de los fragmentos VP8 y VP8L se describen en las secciones Formato de archivo simple (con pérdida) y Formato de archivo simple (sin pérdida), respectivamente.

Perfil de color

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ICCP')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                       Color Profile                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Perfil de color: bytes de Size Chunk
Perfil de ICC

Este fragmento DEBE aparecer antes que los datos de la imagen.

Debe haber, como máximo, una parte de esa parte. Si hay más fragmentos de este tipo, los lectores PUEDEN ignorar todo excepto el primero. Consulte la Especificación del CCC para obtener más información.

Si este fragmento no está presente, se debe suponer que es sRGB.

Metadatos

Los metadatos se pueden almacenar en fragmentos "EXIF" o "XMP".

Debe haber como máximo un fragmento de cada tipo ("EXIF" y "XMP"). Si hay más fragmentos de este tipo, los lectores PUEDEN ignorar todo excepto el primero.

Los fragmentos se definen de la siguiente manera:

Fragmento EXIF:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('EXIF')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                        Exif Metadata                          :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Metadatos Exif: Bytes de tamaño
Metadatos de imagen en formato Exif.

Fragmento de XMP:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('XMP ')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                        XMP Metadata                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Metadatos de XMP: Chunk Size bytes
Metadatos de imagen en formato XMP.

Observe que el cuarto carácter del campo "XMP" de FourCC es un espacio ASCII (0x20).

Puedes encontrar orientación adicional sobre el manejo de metadatos en los Lineamientos para el manejo de metadatos del Grupo de trabajo de metadatos.

Fragmentos desconocidos

Un fragmento RIFF (descrito en esta sección), cuya etiqueta de fragmento es diferente de cualquiera de los fragmentos descritos en este documento, se considera un fragmento desconocido.

Razón: Permitir fragmentos desconocidos proporciona una extensión para el futuro de formato y también permite el almacenamiento de datos específicos de la aplicación.

Un archivo PUEDE contener fragmentos desconocidos:

Los lectores DEBEN ignorar estos fragmentos. Los escritores DEBEN conservarlos en su orden original (a menos que tengan la intención específica de modificar estos fragmentos).

Arma el lienzo desde los marcos

Aquí proporcionamos una descripción general de cómo el lector DEBE ensamblar un lienzo en el caso de una imagen animada.

El proceso comienza con la creación de un lienzo con las dimensiones proporcionadas en el fragmento "VP8X", de Canvas Width Minus One + 1 píxeles de ancho por Canvas Height Minus One + 1 píxeles de alto. El campo Loop Count del fragmento “ANIM” controla cuántas veces se repite el proceso de animación. Es Loop Count - 1 para los valores Loop Count distintos de cero o, de forma infinita, si Loop Count es cero.

Al comienzo de cada iteración, el lienzo se rellena con el color de fondo del fragmento "ANIM" o un color definido por la aplicación.

Los fragmentos "ANMF" contienen fotogramas individuales que aparecen en orden de visualización. Antes de procesar cada marco, se aplica el Disposal method del marco anterior.

El procesamiento del marco decodificado comienza en las coordenadas cartesianas (2 * Frame X, 2 * Frame Y) con la esquina superior izquierda del lienzo como origen. Se renderizan Frame Width Minus One + 1 píxeles de ancho por Frame Height Minus One + 1 píxeles de alto en el lienzo mediante el Blending method.

Se muestra el lienzo durante Frame Duration milisegundos. Esto continúa hasta que se muestren todos los fotogramas proporcionados por los fragmentos "ANMF". Una iteración de bucle nueva se inicia o el lienzo queda en su estado final si todas las iteraciones se completaron.

El siguiente pseudocódigo ilustra el proceso de representación. La notación VP8X.field hace referencia al campo del fragmento "VP8X" con la misma descripción.

assert VP8X.flags.hasAnimation
canvas ← new image of size VP8X.canvasWidth x VP8X.canvasHeight with
         background color ANIM.background_color.
loop_count ← ANIM.loopCount
dispose_method ← Dispose to background color
if loop_count == 0:
  loop_count = ∞
frame_params ← nil
assert next chunk in image_data is ANMF
for loop = 0..loop_count - 1
  clear canvas to ANIM.background_color or application defined color
  until eof or non-ANMF chunk
    frame_params.frameX = Frame X
    frame_params.frameY = Frame Y
    frame_params.frameWidth = Frame Width Minus One + 1
    frame_params.frameHeight = Frame Height Minus One + 1
    frame_params.frameDuration = Frame Duration
    frame_right = frame_params.frameX + frame_params.frameWidth
    frame_bottom = frame_params.frameY + frame_params.frameHeight
    assert VP8X.canvasWidth >= frame_right
    assert VP8X.canvasHeight >= frame_bottom
    for subchunk in 'Frame Data':
      if subchunk.tag == "ALPH":
        assert alpha subchunks not found in 'Frame Data' earlier
        frame_params.alpha = alpha_data
      else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L":
        assert bitstream subchunks not found in 'Frame Data' earlier
        frame_params.bitstream = bitstream_data
    render frame with frame_params.alpha and frame_params.bitstream
      on canvas with top-left corner at (frame_params.frameX,
      frame_params.frameY), using blending method
      frame_params.blendingMethod.
    canvas contains the decoded image.
    Show the contents of the canvas for
    frame_params.frameDuration * 1ms.
    dispose_method = frame_params.disposeMethod

Ejemplos de diseños de archivo

Una imagen codificada con pérdida con alfa puede verse de la siguiente manera:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ALPH (alpha bitstream)
+- VP8 (bitstream)

Una imagen codificada sin pérdidas puede verse de la siguiente manera:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- XYZW (unknown chunk)
+- VP8L (lossless bitstream)

Una imagen sin pérdida con perfil ICC y metadatos XMP puede verse de la siguiente manera:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ICCP (color profile)
+- VP8L (lossless bitstream)
+- XMP  (metadata)

Una imagen animada con metadatos EXIF puede tener el siguiente aspecto:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ANIM (global animation parameters)
+- ANMF (frame1 parameters + data)
+- ANMF (frame2 parameters + data)
+- ANMF (frame3 parameters + data)
+- ANMF (frame4 parameters + data)
+- EXIF (metadata)