· 6 min read

Cómo funcionan los GIF animados — De los marcos de los lienzos a la compresión LZW

El formato GIF tiene 39 años y todavía en todas partes. Esto es lo que pasa entre hacer clic en "Exportar" y conseguir un archivo — captura de marco, cuantificación de color, compresión LZW, y por qué su GIF es 4MB.

¿Por qué GIF aún existe

El Formato de Intercambio Gráficos fue creado por CompuServe en 1987 [CompuServe, 1987]. Es compatible con la animación, la transparencia y la compresión sin pérdidas. Se limita a 256 colores por marco. No tiene audio. Produce archivos grandes. Por cada medida técnica, debería haber sido reemplazada hace décadas.

Y sin embargo: Discord, Slack, iMessage, Twitter, Reddit, y email todos apoyan a GIFs nativamente. GIPHY sirve más de 10 mil millones de GIF por día [GIPHY, 2020]. El formato persiste porque funciona en todas partes, no requiere codec, y juega automáticamente. Ningún otro formato tiene esta combinación de soporte universal y reproducción de fricción cero.

Comprender cómo funcionan los GIF más allá de la trivia — explica por qué su GIF exportado es 4MB, por qué los gradientes se ven unidos, y qué puede hacer al respecto.

Paso 1: Captura de marco

Un GIF animado es una secuencia de imágenes (frames) mostrada en orden con un retraso entre cada una. Para crear uno de una animación de tela, es necesario capturar el estado de lienzo a intervalos regulares.

En un navegador, esto significa la lectura de datos de píxeles de un elemento HTML <canvas> en cada tiempo de fotograma — típicamente a través de canvas.toDataURL() o ctx.getImageData(). La animación está avanzada a la hora de destino, el lienzo se hace, y los píxeles son capturados. La restricción clave: debe esperar el ciclo de pintura del navegador (requestAnimationFrame) antes de leer píxeles, de lo contrario, captura un búfer de establo.

Un GIF típico a 15 FPS durante 3 segundos requiere 45 capturas de marco. A 1080×1080 resolución, cada marco es aproximadamente 4.7 millones de píxeles.

Paso 2: Cuantización de color

GIF admite un máximo de 256 colores por marco, almacenado en una tabla de color (paleta). Un marco de lona típico tiene miles de colores distintos. Reducir a 256 sin degradación visible es la parte más dura de la codificación GIF.

El enfoque estándar es el algoritmo de corte mediano [Heckbert, 1982]: ordenar todos los píxeles por su canal más rojo, dividir la lista en la mediana, repetir para el espacio de color verde y azul, dividiendo recursivamente en 256 regiones. El promedio de cada región se convierte en una entrada de paleta. Esto es lo que gif.js — la biblioteca PinePaper utiliza— implementa en Web Workers para el paralelismo [Rubaxa, gif.js].

La cuantificación de color es por qué los GIF manejan bien los gráficos de color plano pero luchan con fotografías y gradientes. Un gradiente a través de 1080 píxeles podría utilizar 500+ colores distintos. Compresing a 256 produce bandas visibles - pasos discretos donde el gradiente debe ser suave.

Lo que puedes hacer al respecto Use menos colores en su diseño. Formas planas, rellenos sólidos y texto cuantizan bien. Los gradientes suaves y las texturas fotográficas no. Si su GIF tiene banda, simplifica la paleta, no la resolución.

Paso 3: Compresión LZW

Los índices de píxel de cada marco (referencias en la paleta de 256 colores) se comprimen mediante compresión Lempel-Ziv-Welch (LZW) [Welch, 1984]. LZW construye un diccionario de secuencias de byte repetidas mientras escanea los datos. Cuando se encuentra con una secuencia que ha visto antes, produce el índice de diccionario en lugar de los bytes crudos.

Esto significa que la compresión GIF es más eficaz cuando hay grandes áreas de color repetido — fondos sólidos, formas planas, texto en una superficie uniforme. Las texturas complejas con variación de nivel píxel producen malas relaciones de compresión porque el diccionario LZW encuentra pocas secuencias repetidas.

Práctica implicación: Un 1080×1080 GIF de texto blanco en un fondo negro puede comprimir a 200KB. La misma resolución GIF de una fotografía compleja podría ser de 8 MB. El tamaño del archivo depende más de la complejidad visual que de la resolución o el recuento del marco.

Paso 4: Eliminación y optimización del marco

Los marcos GIF pueden especificar un método desposal: ya sea para limpiar el lienzo antes de dibujar el siguiente marco, dejar el marco anterior visible, o restaurar al fondo. Los encoderes Smart GIF usan frame diferenciando — codificando sólo los píxeles que cambiaron entre marcos, no todo el marco.

Si su animación tiene un fondo estático con un pequeño elemento en movimiento, un GIF optimizado codifica el fondo una vez y sólo actualiza la región donde el elemento se movió. Esto reduce drásticamente el tamaño del archivo. El encoder de PinePaper utiliza gif.js que aplica esta optimización automáticamente.

Los Números

Para una animación PinePaper típica (1080×1080, 15 FPS, 3 segundos, fondo oscuro con texto animado):

Componente Tamaño
Marcos brutos (45 × 4.7M píxeles × 3 bytes) ~634 MB
Después de la cuantificación (256 colores, 1 byte/pixel) ~211 MB
Después de la compresión LZW ~2-4 MB
Diferenciando el marco ~1-2 MB

La relación de compresión de crudo a final es de aproximadamente 300:1 a 600:1. La mayoría de esto proviene de la cuantificación de color (3:1) y LZW (50:1 a 100:1).

Cuándo utilizar GIF vs Otros formatos

Formato Mejor Limitación
GIF Soporte universal, autojuego, aplicaciones de mensajería 256 colores, archivos grandes, no audio
WebM (VP9) La mejor calidad, archivos más pequeños, web Soporte limitado en Safari, iMessage
MP4 (H.264) Medios sociales, videojuegos Requiere codec, ninguna transparencia
APNG Animación de color completo con transparencia Soporte limitado en navegadores antiguos

GIF es la opción correcta cuando usted necesita compatibilidad universal y auto-jugar. Para la calidad o tamaño de archivo, WebM o MP4 son mejores.

Pruébalo

Abrir PinePaper Studio, crear un diseño y exportar como GIF. Observe cómo el tamaño del archivo cambia como usted:

  • Aumentar el conteo de marcos (más marcos = archivo más grande, proporcionalmente)
  • Añadir gradientes (cuantización pobre = archivo más grande)
  • Use colores sólidos (buena cuantificación = archivo más pequeño)
  • Aumentar el tamaño de la tela (más píxeles por marco = archivo más grande)

Cada cambio es una medición del oleoducto de compresión. No sólo estás haciendo un GIF: estás observando cómo la teoría de la información se aplica a tu diseño.

Referencias

  • CompuServe (1987). Gráficos Intercambiar Formato Especificación, Versión 87a.
  • GIPHY (2020). GIPHY Annual Report: 10 Billion Daily Serves.
  • Heckbert, P. (1982). Cuantización de imagen de color para pantalla de amortiguación de marco. * Gráficos de computación (SIGGRAPH)*, 16(3), 297-307.
  • Rubaxa. gif.js — JavaScript GIF encoder using Web Workers. github.com/jnordberg/gif.js.
  • Welch, T.A. (1984). Una técnica para la compresión de datos de alto rendimiento. IEEE Computer, 17(6), 8-19.

La exportación PinePaper de GIF es gratuita, sin marca de agua, sin registro. Abra pinepaper.studio/editor y exporte su primera animación.

Ready to create?

Start making animated GIFs, videos, and graphics — free, no signup.

Open PinePaper Editor