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 datos | Nombre completo | Función | ¿Obligatorio? | Tamaño típico |
|---|---|---|---|---|
| Firma | PNG Signature | Identificador de 8 bytes (89 50 4E 47 0D 0A 1A 0A) | Obligatorio | 8 bytes |
| IHDR | Image Header | Información básica de la imagen (dimensiones/profundidad de color/tipo de color) | Obligatorio | 25 bytes |
| IDAT | Image Data | Datos de píxeles comprimidos (codificación DEFLATE) | Obligatorio | Variable (cuerpo principal) |
| IEND | Image End | Marca de fin de archivo | Obligatorio | 12 bytes |
| PLTE | Palette | Paleta (modo de color indexado) | Obligatorio para indexado | ≤768 bytes |
| tRNS | Transparency | Información de transparencia | Opcional | Variable |
| tEXt | Text | Metadatos de texto (autor/descripción, etc.) | Opcional | Variable |
| gAMA | Image Gamma | Información de corrección Gamma | Opcional | 16 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.
| Paso | Algoritmo | Principio | Redundancia eliminada | Reversibilidad |
|---|---|---|---|---|
| Primer paso | LZ77 | Busca secuencias de bytes repetidas, las sustituye por referencias (distancia, longitud) | Redundancia de secuencias repetidas | Completamente reversible |
| Segundo paso | Codificación Huffman | Datos de alta frecuencia con códigos cortos, baja frecuencia con códigos largos | Redundancia de codificación | Completamente 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 datos | Efecto de compresión LZ77 | Tasa de compresión típica | Causa |
|---|---|---|---|
| Gran área de color sólido | Excelente | 95%+ | Secuencias largas, alta eficiencia de sustitución |
| Degradado horizontal | Bueno | 70%-85% | Patrón de degradado coincidente |
| Textura regular | Bueno | 60%-80% | Textura repetida referenciable |
| Ruido aleatorio | Pobre | 0%-10% | Sin secuencias repetidas |
| Foto natural | Pobre | 5%-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 filtro | Nombre | Fórmula de predicción | Escenario de uso |
|---|---|---|---|
| 0 | None | Sin predicción, valor original | Datos de ruido sin patrón |
| 1 | Sub | Valor actual - valor izquierdo | Imagen con degradado horizontal |
| 2 | Up | Valor actual - valor superior | Imagen con degradado vertical |
| 3 | Average | Valor actual - (izq.+sup.)/2 | Imagen con transición suave |
| 4 | Paeth | Valor actual - valor predicho Paeth | General (ó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 imagen | Dimensiones | BMP original | PNG | JPEG(q80) | WebP(q80) | Tasa de compresión PNG |
|---|---|---|---|---|---|---|
| Captura de UI | 1920x1080 | 5.93MB | 0.35MB | 0.82MB | 0.28MB | 94.1% |
| Wireframe | 2000x1500 | 8.58MB | 0.42MB | 1.15MB | 0.35MB | 95.1% |
| Foto natural | 3000x2000 | 17.16MB | 12.50MB | 1.80MB | 1.42MB | 27.2% |
| Retrato | 4000x3000 | 34.33MB | 28.80MB | 3.50MB | 2.80MB | 16.1% |
| Conjunto de iconos | 1024x1024 | 3.00MB | 0.08MB | 0.45MB | 0.06MB | 97.3% |
| Documento escaneado | 2480x3508 | 24.80MB | 1.20MB | 0.85MB | 0.72MB | 95.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 imagen | PNG estándar | PNG optimizado | Reducción tras optimización | Método de optimización |
|---|---|---|---|---|
| Captura de UI | 0.42MB | 0.35MB | 16.7% | Filtro Paeth + zlib nivel máximo |
| Wireframe | 0.52MB | 0.42MB | 19.2% | Filtro óptimo por línea + eliminar metadatos |
| Conjunto de iconos | 0.12MB | 0.08MB | 33.3% | Convertir a indexado 8 bits + filtro óptimo |
| Documento escaneado | 1.50MB | 1.20MB | 20.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.
Artículos relacionados
¿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.