Principios de compresión PNG: ¿por qué DEFLATE es sin pérdida?

Conclusión primero: PNG es compresión sin pérdida porque usa el algoritmo DEFLATE — la compresión de diccionario LZ77 y la codificación Huffman son ambas operaciones matemáticas completamente reversibles; los datos descomprimidos son idénticos byte a byte a los datos originales. El flujo de compresión de PNG es: los datos de píxeles pasan primero por una predicción de filtro de línea para eliminar la redundancia entre píxeles adyacentes, y luego se comprimen con DEFLATE. Una captura de UI de 3000x2000 pasa de 17,2 MB originales a 0,35 MB en PNG, una reducción del 97,9 %, sin que cambie ningún valor de píxel. A continuación se detalla desde dos niveles: la estructura del archivo PNG y el principio del algoritmo DEFLATE.

Si aún no está familiarizado con los métodos generales de compresión de imágenes, le recomendamos leerGuía de compresión de imágenes: comparación de formatos JPG/PNG/WebP

1. Estructura del archivo PNG: cómo se organizan los datos

Un archivo PNG consta de una serie de bloques de datos (chunks); cada chunk contiene cuatro partes: tipo, longitud, datos y verificación. Comprender la función de estos chunks equivale a entender la estructura interna del archivo PNG.

Bloque de datosNombre completoFunción¿Obligatorio?Tamaño típico
FirmaPNG SignatureIdentificador de 8 bytes (89 50 4E 47 0D 0A 1A 0A)Obligatorio8 bytes
IHDRImage HeaderInformación básica de la imagen (dimensiones/profundidad de color/tipo de color)Obligatorio25 bytes
IDATImage DataDatos de píxeles comprimidos (codificación DEFLATE)ObligatorioVariable (cuerpo principal)
IENDImage EndMarca de fin de archivoObligatorio12 bytes
PLTEPalettePaleta (modo de color indexado)Obligatorio para indexado≤768 bytes
tRNSTransparencyInformación de transparenciaOpcionalVariable
tEXtTextMetadatos de texto (autor/descripción, etc.)OpcionalVariable
gAMAImage GammaInformación de corrección GammaOpcional16 bytes

El chunk más importante de PNG es IDAT, que almacena los datos de píxeles tras la predicción de filtro y la compresión DEFLATE. Una imagen RGB de 24 bits de 3000x2000 tiene unos 17,2 MB de datos de píxeles originales (3000x2000x3 bytes); tras la compresión PNG, la parte IDAT puede ser de solo 0,3-0,5 MB. El efecto de compresión depende principalmente de la repetibilidad del contenido de la imagen: las grandes áreas de color sólido tienen la tasa de compresión más alta y las fotos con ruido la más baja.

2. Principio del algoritmo DEFLATE: compresión en dos pasos LZ77+Huffman

El motor de compresión central de PNG es el algoritmo DEFLATE, que consta de dos pasos: el primero, compresión de diccionario LZ77, elimina secuencias repetidas; el segundo, codificación Huffman, elimina la redundancia de codificación. Ambos pasos son operaciones reversibles sin pérdida; esta es la razón fundamental por la que la compresión PNG es sin pérdida.

PasoAlgoritmoPrincipioRedundancia eliminadaReversibilidad
Primer pasoLZ77Busca secuencias de bytes repetidas, las sustituye por referencias (distancia, longitud)Redundancia de secuencias repetidasCompletamente reversible
Segundo pasoCodificación HuffmanDatos de alta frecuencia con códigos cortos, baja frecuencia con códigos largosRedundancia de codificaciónCompletamente reversible

1. Compresión de diccionario LZ77

LZ77 es un algoritmo de compresión de diccionario de "ventana deslizante". Mantiene una ventana deslizante (normalmente 32 KB) y busca la secuencia de bytes más larga que coincida con la posición actual dentro de la ventana. Si encuentra una coincidencia, sustituye esa secuencia por una referencia (distancia, longitud); si no, emite el byte original.

Ejemplo: supongamos que los datos de la imagen contienen píxeles blancos consecutivos (RGB 255,255,255) repetidos 1000 veces. LZ77 encontraría este patrón repetido en la ventana; tras registrar el primer triple, los 999 triples siguientes se sustituyen por una referencia "retroceder 3 bytes, copiar 3 bytes, repetir 999 veces". Los 3000 bytes originales se comprimen en una secuencia de referencias de poco más de diez bytes, con una tasa de compresión superior al 99 %.

Característica de datosEfecto de compresión LZ77Tasa de compresión típicaCausa
Gran área de color sólidoExcelente95%+Secuencias largas, alta eficiencia de sustitución
Degradado horizontalBueno70%-85%Patrón de degradado coincidente
Textura regularBueno60%-80%Textura repetida referenciable
Ruido aleatorioPobre0%-10%Sin secuencias repetidas
Foto naturalPobre5%-20%diferencias grandes entre píxeles, pocas coincidencias

2. Codificación Huffman

Los datos de salida de LZ77 (mezcla de referencias y bytes originales) pasan luego por la codificación Huffman. La idea central de Huffman es: los símbolos de alta frecuencia reciben códigos cortos y los de baja frecuencia códigos largos, reduciendo así la longitud media de codificación.

Ejemplo: si en la salida de LZ77 la "marca de referencia" aparece con una frecuencia del 60 %, el valor de byte 255 con un 20 % y otros valores en pequeñas proporciones, Huffman asignaría 2 bits a la "marca de referencia", 3 bits al valor 255 y 8-12 bits a los valores de baja frecuencia. La longitud media de codificación por símbolo pasaría de 8 bits fijos a 3-4 bits, comprimiendo además un 50 % aproximadamente.

DEFLATE usa dos modos de codificación Huffman: árbol Huffman fijo (tabla de codificación predefinida, rápido pero con tasa de compresión media) y árbol Huffman dinámico (construye la tabla óptima según la frecuencia real de los datos, mayor tasa de compresión pero requiere almacenar la tabla). El estándar PNG exige usar codificación Huffman dinámica para obtener la mejor compresión.

3. Mecanismo de compresión sin pérdida: predicción de filtro + DEFLATE

La compresión sin pérdida de PNG no solo depende del algoritmo DEFLATE, sino también de un paso de preprocesamiento clave: la predicción de filtro de línea (Filter). Este paso se ejecuta antes de DEFLATE y su propósito es hacer que los datos de píxeles sean más adecuados para la compresión LZ77.

Los píxeles adyacentes en una imagen suelen tener valores similares (por ejemplo, los píxeles de una zona de cielo azul tienen valores cercanos). La predicción de filtro de línea resta a cada valor de píxel el valor del píxel a su izquierda o arriba, convirtiendo valores absolutos en diferencias. Estas diferencias suelen ser pequeñas o cero, un patrón de datos más adecuado para la compresión LZ77 y Huffman.

Tipo de filtroNombreFórmula de predicciónEscenario de uso
0NoneSin predicción, valor originalDatos de ruido sin patrón
1SubValor actual - valor izquierdoImagen con degradado horizontal
2UpValor actual - valor superiorImagen con degradado vertical
3AverageValor actual - (izq.+sup.)/2Imagen con transición suave
4PaethValor actual - valor predicho PaethGeneral (óptimo para la mayoría de imágenes)

El codificador PNG puede elegir el tipo de filtro de cada línea de forma independiente. SmartSlim, basado en un motor de compresión Rust propio, prueba los 5 tipos de filtro en cada línea y selecciona el que ofrece la mejor compresión, lo que reduce el tamaño un 10 %-20 % adicional respecto a usar un único filtro fijo.

Flujo completo de compresión:
píxeles originales -> predicción de filtro (filtro óptimo) -> compresión de diccionario LZ77 -> Codificación Huffman -> bloque de datos IDAT

El flujo de descompresión es completamente inverso:
bloque de datos IDAT -> decodificación Huffman -> descompresión LZ77 -> restauración inversa de filtro -> píxeles originales

Ambos pasos son operaciones matemáticas inversas exactas; los datos de píxeles descomprimidos son idénticos byte a byte a los datos originales. Esta es la garantía fundamental de que PNG es sin pérdida.

4. Datos reales: comparación de tamaño PNG vs JPEG vs WebP

Usamos el mismo conjunto de imágenes de prueba para comparar el efecto de compresión de tres formatos, cubriendo distintos tipos de contenido.

Tipo de imagenDimensionesBMP originalPNGJPEG(q80)WebP(q80)Tasa de compresión PNG
Captura de UI1920x10805.93MB0.35MB0.82MB0.28MB94.1%
Wireframe2000x15008.58MB0.42MB1.15MB0.35MB95.1%
Foto natural3000x200017.16MB12.50MB1.80MB1.42MB27.2%
Retrato4000x300034.33MB28.80MB3.50MB2.80MB16.1%
Conjunto de iconos1024x10243.00MB0.08MB0.45MB0.06MB97.3%
Documento escaneado2480x350824.80MB1.20MB0.85MB0.72MB95.2%

Los datos revelan una conclusión clave: el efecto de compresión de PNG depende enormemente del tipo de imagen. Para capturas de UI, wireframes e iconos con grandes áreas de color sólido, la tasa de compresión de PNG alcanza el 94 %-97 %, muy superior a JPEG. Sin embargo, para fotos naturales y retratos con grandes diferencias entre píxeles, la tasa de compresión de PNG es solo del 16 %-27 %, muy inferior al 89 %-90 % de JPEG.

Veamos la comparación antes y después de la optimización PNG, con PNG estándar frente a PNG optimizado:

Tipo de imagenPNG estándarPNG optimizadoReducción tras optimizaciónMétodo de optimización
Captura de UI0.42MB0.35MB16.7%Filtro Paeth + zlib nivel máximo
Wireframe0.52MB0.42MB19.2%Filtro óptimo por línea + eliminar metadatos
Conjunto de iconos0.12MB0.08MB33.3%Convertir a indexado 8 bits + filtro óptimo
Documento escaneado1.50MB1.20MB20.0%Filtro óptimo por línea + eliminar gAMA

La optimización PNG de SmartSlim puede reducir el tamaño un 15 %-33 % adicional respecto al PNG estándar; la clave es la combinación de selección de filtro óptimo por línea y el nivel máximo de compresión zlib.

Para más comparaciones de formatos, consulteCompresión sin pérdida vs con pérdida: diferencias clavey Comparación de formatos WebP vs PNG vs JPG

5. Preguntas frecuentes (FAQ)

Q1: ¿Por qué PNG es compresión sin pérdida?

PNG usa el algoritmo DEFLATE para comprimir datos. Este algoritmo consta de dos pasos: compresión de diccionario LZ77 y codificación Huffman. LZ77 busca secuencias de bytes repetidas y las sustituye por referencias de distancia+longitud; Huffman usa codificación de longitud variable para que los datos de alta frecuencia usen códigos cortos. Ambos pasos son operaciones reversibles: al descomprimir, Huffman decodifica los códigos de longitud variable y LZ77 restaura los bytes originales según las referencias. Los datos son idénticos, sin pérdida de información, por lo que PNG es compresión sin pérdida.

Q2: ¿Cuál tiene mayor tasa de compresión, PNG o JPEG?

Para fotos, la tasa de compresión de JPEG es muy superior a la de PNG. Una foto de 3000x2000 ocupa unos 12,5 MB en PNG y 1,8 MB en JPEG (calidad 80), una diferencia de 7×. Esto se debe a que JPEG usa transformación DCT con pérdida, descartando detalles de alta frecuencia, mientras que PNG debe conservar cada píxel sin pérdida. Sin embargo, para imágenes con grandes áreas de color sólido como wireframes, capturas de pantalla e iconos, PNG es más pequeño: una captura de UI ocupa 0,3 MB en PNG frente a 0,8 MB en JPEG (calidad 80). La elección del formato depende del tipo de contenido.

Q3: ¿Cuál es la tasa de compresión máxima de PNG?

Depende del contenido de la imagen. Las imágenes con grandes áreas de color sólido o degradados pueden alcanzar una tasa de compresión superior al 90 % (p. ej., una captura de UI de 5 MB se reduce a 0,3 MB); las fotos con mucho ruido suelen tener solo un 10 %-30 %, porque la diferencia entre píxeles es grande y LZ77 no encuentra secuencias repetidas. El límite teórico de PNG con DEFLATE está alrededor del nivel de compresión ZIP; no puede lograr tasas tan altas como JPEG descartando información.

Q4: ¿Cuál es la diferencia entre optimización PNG y compresión PNG?

La compresión PNG consiste en codificar los datos de píxeles originales con DEFLATE al formato PNG; es el proceso estándar. La optimización PNG reduce aún más el tamaño sobre la base de la compresión estándar, e incluye: probar 5 tipos de predicción de filtro por línea y elegir el óptimo, usar el nivel máximo de compresión zlib, eliminar chunks de metadatos (como tEXt/gAMA) y convertir RGBA de 24 bits a color indexado de 8 bits (si hay ≤256 colores). La optimización PNG de SmartSlim puede reducir el tamaño un 15 %-30 % adicional respecto al PNG estándar.

Resumen

La razón por la que PNG logra compresión sin pérdida es que ambos pasos del algoritmo DEFLATE — LZ77 y Huffman — son operaciones matemáticas completamente reversibles, complementadas con la predicción de filtro de línea que mejora la compresibilidad de los datos. PNG ofrece una compresión excelente para imágenes con grandes áreas de color sólido como capturas de UI, wireframes e iconos (tasa de compresión 94 %-97 %), pero su tasa de compresión es limitada para fotos (16 %-27 %); en estos casos se debería elegir JPEG o WebP.

Si necesita optimizar el tamaño de imágenes PNG, SmartSlim ofrece, basado en su motor de compresión Rust, filtro óptimo por línea y compresión zlib en el nivel máximo, reduciendo el tamaño un 15 %-33 % adicional respecto al PNG estándar. Admite 9 formatos de imagen (png, jpg, jpeg, webp, bmp, tiff, etc.) con compresión local sin que los datos salgan del dominio.

¿Necesita comprimir archivos? Pruebe SmartSlim

Construido sobre un motor de compresión Rust propio, compatible con 10 categorías y más de 40 formatos, incluyendo PDF, imágenes, vídeo, Office y OFD, con compresión local que mantiene sus datos en sus instalaciones.