Pregunta ¿Cómo es PNG lossless dado que tiene un parámetro de compresión?


Se dice que los archivos PNG usan compresión sin pérdida. Sin embargo, cada vez que estoy en un editor de imágenes, como CAÑUTILLO y tratar de guardar una imagen como un archivo PNG, solicita el parámetro de compresión, que oscila entre 0 y 9. Si tiene un parámetro de compresión que afecta la precisión visual de la imagen comprimida, ¿cómo hace que PNG pierda?

¿Obtengo un comportamiento sin pérdidas solo cuando configuro el parámetro de compresión en 9?


149


origen


La mayoría de los algoritmos de compresión sin pérdida tienen parámetros ajustables (como el tamaño del diccionario) que se generalizan en un control deslizante "cuánto esfuerzo se debe hacer para minimizar el tamaño de salida". Esto es válido para ZIP, GZip, BZip2, LZMA, ... - Daniel B
La pregunta podría formularse de manera diferente. Si no se pierde calidad de la compresión, ¿por qué no usar siempre la compresión que produce el tamaño más pequeño? La respuesta entonces sería, porque requiere más RAM y más tiempo de CPU para comprimir y descomprimir. A veces quieres una compresión más rápida y no te importa tanto la relación de compresión. - kasperd
La compresión PNG es casi idéntica a los archivos ZIPping. Puedes comprimirlos más o menos pero obtienes el archivo exacto cuando descomprime, eso es lo que lo hace sin pérdidas. - mikebabcock
La mayoría de los programas de compresión, como Zip y Rar, le permiten ingresar el "nivel de compresión", que le permite elegir entre archivos más pequeños <-> de menor tiempo. No significa que estos software descartan datos durante la compresión. Esta configuración (en GIMP, pngcrush, etc.) es similar. - Salman A
@naxa: No hay advertencias sobre qué tan png sin pérdidas es en realidad. Siempre es 100% sin pérdidas. El artículo solo le advierte sobre los errores que algunos navegadores antiguos tenían en su implementación PNG para manejar la corrección gamma. Y eso solo es significativo si necesita hacer coincidir el color con los colores CSS (que no están corregidos con gamma). - Pauli L


Respuestas:


PNG no tiene pérdida. Es muy probable que GIMP simplemente no use la mejor palabra en este caso. Piénselo como "calidad de compresión", o en otras palabras, "nivel de compresión". Con una compresión más baja, obtienes un archivo más grande, pero lleva menos tiempo producir, mientras que con una compresión más alta, obtienes un archivo más pequeño que tarda más en producirse. Por lo general, obtiene rendimientos decrecientes (es decir, no disminuye tanto el tamaño en comparación con el aumento del tiempo que lleva) cuando sube a los niveles de compresión más altos, pero depende de usted.


181



Además, la compresión PNG tiene muchos parámetros ajustables donde los ajustes en cualquier dirección pueden reducir el tamaño de la salida dependiendo del contenido de la fuente; es mucho más complejo que un control deslizante simple "mejor" y "peor". Para fines generales, no es demasiado importante, pero si quieres lo más pequeño, utiliza una herramienta como pngcrush que puede comparar muchas variaciones para el más pequeño posible. - Bob
Un nivel de compresión más alto aumenta el tiempo de compresión, pero también afecta descompresión ¿también? - Nolonar
@Nolonar Generalmente no; en todo caso, un nivel de compresión más alto generalmente disminuye el tiempo de descompresión porque hay menos datos para que tenga que leer y procesar. El mayor tiempo de compresión se debe a un trabajo más exhaustivo para encontrar patrones para comprimir (simplificación excesiva). - fluffy
La respuesta de @fluffy LordNeckbeard tuvo la mayor compresión de tomar 5 veces más para decodificar que la más baja. - André Chalella
Para PNG, es es bastante común tener un tiempo de descompresión más largo para archivos mejor comprimidos. El problema es que con PNG, un truco posible es aplicar el algoritmo de compresión una y otra vez, siempre que el archivo se haga más pequeño. Una vez que el tamaño aumenta, deja de aplicarlo. Por lo tanto, es muy posible que aplique el algoritmo de compresión 5 o 6 veces, lo que significa que debe descomprimir el archivo 5 o 6 veces para visualizar la imagen. - yo'


PNG está comprimido, pero sin pérdidas

El nivel de compresión es una compensación entre el tamaño del archivo y la velocidad de codificación / descodificación. Para generalizar demasiado, incluso los formatos sin imágenes, como FLAC, tienen conceptos similares.

Diferentes niveles de compresión, misma salida decodificada

Aunque los tamaños de archivo son diferentes, debido a los diferentes niveles de compresión, la salida decodificada real será idéntica.

Puedes comparar el MD5 hash de las salidas descodificadas con ffmpeg utilizando el MD5 muxer.

Esto se ve mejor con algunos ejemplos:

Crea archivos PNG:

$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
  • Por defecto ffmpeg utilizará -compression_level 100 para salida PNG.

Comparar tamaño de archivo:

$ du -h *.png
  228K    0.png
  4.0K    100.png

Decodifica los archivos PNG y muestra hashes MD5:

$ ffmpeg -loglevel error -i 0.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

$ ffmpeg -loglevel error -i 100.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

Como ambos hash son iguales, puede estar seguro de que las salidas descodificadas (el video en bruto sin comprimir) son exactamente iguales.


210



+1 no sabía que ffmpeg podría manejar pngs. - Lekensteyn
@Lekensteyn Es genial para haciendo capturas de pantalla. Ejemplo para saltear 30 segundos y tomar una captura de pantalla: ffmpeg -ss 30 -i input -vframes 1 output.png También es bueno para hacer videos de imágenes y viceversa. - LordNeckbeard
¿Significa que el PNG debe descomprimirse cada vez que se debe procesar? Porque si eso es cierto, debemos ser - akshay2000
Si vuelve a leer el archivo desde el disco o la memoria caché, sí, tiene que descomprimirse. Dentro de la misma página, sin embargo, es probable que la memoria caché reutilice la versión descomprimida. - David Mårtensson
@ akshay2000 Depende de cómo funciona el programa que procesa el PNG. Por lo general, el archivo se lee del disco, se descomprime y se almacena en la memoria RAM. Por lo tanto, mientras esté almacenado en la memoria RAM, no será necesario descomprimir la imagen nuevamente. - xZise


La compresión PNG ocurre en dos etapas.

  1. La precompresión reorganiza los datos de la imagen para que sea más compresible mediante un algoritmo de compresión de uso general.
  2. La compresión real se realiza mediante DEFLATE, que busca y elimina secuencias de bytes duplicadas al reemplazarlas con tokens cortos.

Como el paso 2 es una tarea que requiere mucho tiempo / recursos, la biblioteca zlib subyacente (encapsulación de DEFLATE sin procesar) toma un parámetro de compresión que va desde 1 = compresión más rápida, 9 = mejor compresión, 0 = sin compresión. De ahí viene el rango 0-9, y GIMP simplemente pasa ese parámetro a zlib. Observe que en el nivel 0 su png en realidad será un poco más grande que el mapa de bits equivalente.

Sin embargo, el nivel 9 es solo el "mejor" que intentará zlib, y sigue siendo un solución de compromiso.
Para realmente tener una idea de esto, si está dispuesto a gastar 1000 veces más potencia de procesamiento en una búsqueda exhaustiva, puede obtener una densidad de datos de 3-8% más alta usando zopfli en lugar de zlib.
La compresión aún no tiene pérdida, es solo una representación DEFLATE más óptima de los datos. Esto se acerca a los límites de una biblioteca compatible con zlib, y por lo tanto es la verdadera "mejor" compresión que es posible lograr usando PNG.


24



Nota: El tiempo de descompresión es el mismo independientemente del nivel de compresión, o del recuento de iteraciones cuando se usa zopflipng. - Adria


Una motivación principal para el formato PNG fue crear un reemplazo para GIF que no solo fuera gratuito, sino también una mejora en prácticamente todos los aspectos. Como resultado, la compresión PNG es completamente sin pérdidas, es decir, los datos de la imagen original se pueden reconstruir exactamente, bit por bit, al igual que en GIF y en la mayoría de las formas de TIFF.

PNG usa un proceso de compresión de 2 etapas:

  1. Precompresión: filtrado (predicción)
  2. Compresión: DESINFLAR (ver wikipedia)

El paso de precompresión se denomina filtrado, que es un método de transformar de forma reversible los datos de imagen para que el motor de compresión principal pueda operar de manera más eficiente.

Como un ejemplo simple, considere una secuencia de bytes aumentando uniformemente de 1 a 255:

1, 2, 3, 4, 5, .... 255

Como no hay repetición en la secuencia, se comprime muy mal o no se comprime en absoluto. Pero una modificación trivial de la secuencia, es decir, dejar el primer byte solo pero reemplazando cada byte subsiguiente por la diferencia entre él y su predecesor, transforma la secuencia en un conjunto extremadamente comprimible:

1, 1, 1, 1, 1, .... 1

La transformación anterior no tiene pérdida, ya que no se omitieron los bytes, y es completamente reversible. El tamaño comprimido de esta serie será muy reducido, pero la serie original aún puede ser perfectamente reconstituido.

Los datos de imagen reales rara vez son perfectos, pero el filtrado mejora la compresión en escala de grises y en las imágenes en color verdadero, y también puede ayudar en algunas imágenes de paleta. PNG admite cinco tipos de filtros, y un codificador puede elegir utilizar un filtro diferente para cada fila de píxeles en la imagen:

image

El algoritmo funciona en bytes, pero para píxeles grandes (por ejemplo, RGB de 24 bits o RGBA de 64 bits) solo se comparan los bytes correspondientes, lo que significa que los componentes rojos de los píxeles son manejado por separado de los componentes de píxel verde y azul.

Para elegir el mejor filtro para cada fila, un codificador debería probar todas las combinaciones posibles. Esto es claramente imposible, ya que incluso una imagen de 20 filas requeriría probar más de 95 billones de combinaciones, donde "probar" implicaría filtrar y comprimir toda la imagen.

Los niveles de compresión normalmente se definen como números entre 0 (ninguno) y 9 (mejor). Se refieren a las compensaciones entre velocidad y tamaño, y se relacionan con la cantidad de combinaciones de fila-filtros deben ser probados. No hay estándares con respecto a estos niveles de compresión, así que cada editor de imágenes puede tener sus propios algoritmos en cuanto a cuántos filtros probar cuando optimizando el tamaño de la imagen.

El nivel de compresión 0 significa que los filtros no se utilizan en absoluto, lo que es rápido pero derrochador. Los niveles más altos significan que cada vez se prueban más combinaciones en filas de imágenes y solo las mejores unos son retenidos.

Supongo que el enfoque más simple para la mejor compresión es comprimir incrementalmente cada fila con cada filtro, guardar el resultado más pequeño y repetir para la siguiente fila. Esto equivale a filtrar y comprimir toda la imagen cinco veces, lo que puede ser una compensación razonable para una imagen que se transmitirá y decodificará muchas veces. Los valores de compresión más bajos harán menos, a discreción del desarrollador de la herramienta.

Además de los filtros, el nivel de compresión también puede afectar el nivel de compresión zlib que es un número entre 0 (sin Deflate) y 9 (Deflate máximo). Cómo el 0-9 especificado los niveles afectan el uso de filtros, que son la característica principal de optimización de PNG, todavía depende del desarrollador de la herramienta.

La conclusión es que PNG tiene un parámetro de compresión que puede reducir el tamaño del archivo de manera muy significativa, todo sin la pérdida de un solo píxel.

Fuentes:

Wikipedia Portable Network Graphics
Documentación libpng Capítulo 9 - Compresión y filtrado


15



No creo que la configuración del nivel de compresión cambie el uso de filtros. La configuración de nivel 1-9 probablemente solo elija el nivel de compresión zlib 1-9, y el nivel 0 significa que el algoritmo de desinflado no se utiliza en absoluto. La mayoría de las implementaciones probablemente no cambien los filtros por fila, pero solo use el filtro de Ruta todo el tiempo. - Pauli L
@PauliL: No estoy de acuerdo, porque en todas las comparaciones del software de compresión PNG, hay grandes diferencias entre los tamaños de las imágenes generadas. Si todos los productos utilizan los mismos parámetros para la misma biblioteca, todos los tamaños deberían haber sido iguales, así como la velocidad. - harrymc
¿Tiene algún enlace a tales comparaciones? - Pauli L
@PauliL: una búsqueda rápida surgió con esta comparación. - harrymc
@PauliL: Probablemente tengas razón en que los niveles de compresión zlib se ven afectados por los niveles de compresión de PNG. He modificado mi respuesta en consecuencia, aunque ninguna herramienta de compresión documenta exactamente lo que hacen. Quizás la explicación de las herramientas con los peores resultados de tamaño es que no usan ningún filtro, solo la compresión zlib. - harrymc


De acuerdo, estoy demasiado tarde para la recompensa, pero esta es mi respuesta de todos modos.

PNG siempre es sin pérdidas. Utiliza el algoritmo Deflate / Inflate, similar a los utilizados en los programas zip.

Deflate algorithm busca secuencias de bytes repetidas y las reemplaza por etiquetas. La configuración de nivel de compresión especifica cuánto esfuerzo usa el programa para encontrar la combinación óptima de secuencias de bytes y la cantidad de memoria reservada para eso. Se trata de un compromiso entre el tiempo y el uso de la memoria frente al tamaño del archivo comprimido. Sin embargo, las computadoras modernas son tan rápidas y tienen suficiente memoria, por lo que rara vez es necesario usar otra configuración que no sea la compresión más alta.

Muchas implementaciones PNG usan la biblioteca zlib para la compresión. Zlib tiene nueve niveles de compresión, 1-9. No sé las partes internas de Gimp, pero como tiene una configuración de nivel de compresión de 0-9 (0 = sin compresión), supongo que esta configuración simplemente selecciona el nivel de compresión de zlib.

El algoritmo de deflación es un algoritmo de compresión de propósito general, no ha sido diseñado para comprimir imágenes. A diferencia de la mayoría de los demás formatos de archivo de imagen sin pérdida, el formato PNG no está limitado a eso. La compresión PNG aprovecha el conocimiento de que estamos comprimiendo un Imagen 2D. Esto se logra por los llamados filtros.

(En este caso, Filter es un término un tanto engañoso. En realidad, no cambia el contenido de la imagen, solo la codifica de manera diferente. Un nombre más preciso sería delta encoder).

La especificación PNG especifica 5 filtros diferentes (incluido 0 = ninguno). El filtro reemplaza los valores absolutos de píxeles con diferencia del pixel anterior a la izquierda, arriba, diagonal o combinación de esos. Esto puede mejorar significativamente la relación de compresión. Cada línea de escaneo en la imagen puede usar un filtro diferente. El codificador puede optimizar la compresión eligiendo el mejor filtro para cada línea.

Para obtener detalles sobre el formato de archivo PNG, consulte Especificación PNG.

Como hay un número prácticamente infinito de combinaciones, no es posible probarlas todas. Por lo tanto, se han desarrollado diferentes tipos de estrategias para encontrar una combinación efectiva. La mayoría de los editores de imágenes probablemente ni siquiera intentan optimizar los filtros línea por línea, sino que simplemente utilizan el filtro fijo (probablemente Paeth).

Un programa de línea de comando pngcrush intenta varias estrategias para encontrar el mejor resultado. Puede reducir significativamente el tamaño del archivo PNG creado por otros programas, pero puede llevar bastante tiempo en imágenes más grandes. Ver Fuente forja - pngcrush.


5





El nivel de compresión en cosas sin pérdidas siempre es solo intercambiar recursos de codificación (generalmente tiempo, a veces también RAM) vs. velocidad de bits. La calidad es siempre 100%

Por supuesto, los compresores sin pérdidas pueden NUNCA garantizamos cualquier compresión real. Los datos aleatorios son incompresibles, no hay un patrón para encontrar y ninguna similitud. Teoría de la información de Shannon y todo eso. El objetivo de la compresión de datos sin pérdida es que los humanos usualmente trabajamos con datos altamente no aleatorios, pero para la transmisión y el almacenamiento, podemos comprimirlo en la menor cantidad de bits posible. Con suerte hasta lo más cerca posible de la Complejidad Kolmogorov del original.

Ya sea zip o datos genéricos 7z, imágenes png, audio flac o video h.264 (en modo sin pérdida), es lo mismo. Con algunos algoritmos de compresión, como lzma (7zip) y bzip2, al aumentar la configuración de compresión aumentará el tiempo de CPU del DECODER (bzip2) o más a menudo la cantidad de RAM necesaria (lzma y bzip2, y h.264 con más marcos de referencia) . A menudo el decodificador tiene que guardar más salida decodificada en la RAM porque la decodificación del siguiente byte podría referirse a un byte decodificado hace muchos megabytes (por ejemplo, un marco de video que es más similar a uno de hace medio segundo sería codificado con referencias a 12 fotogramas atrás ) Lo mismo con bzip2 y elegir un tamaño de bloque grande, pero que también descomprime más lento. lzma tiene un diccionario de tamaño variable, y puede crear archivos que requieran 1.5GB de RAM para decodificar.


3



Hmmm vi una implementación para detener el control del motor paso a paso y dirigirlo directamente para proporcionar compresión garantizada sin pérdidas. La codificación de Manchester es fácil de superar si tienes una fuente de reloj de alta resolución. - Joshua
@Joshua: Usar un formato de almacenamiento físico de mayor densidad no es lo mismo que la compresión de datos ... - SamB


En primer lugar, PNG siempre es sin pérdidas. La aparente paradoja se debe al hecho de que hay dos tipos diferentes de compresión posibles (para cualquier tipo de datos): con pérdida y sin pérdidas.

Compresión sin perdidas comprime los datos (es decir, el tamaño del archivo) usando varios trucos, manteniendo todo y sin hacer ninguna aproximación. Como resultado, es posible que la compresión sin pérdida no pueda realmente comprimir nada. (Técnicamente, los datos con alta entropía pueden ser muy difíciles o incluso imposibles de comprimir para métodos sin pérdidas).     Compresión de pérdida aproxima los datos reales, pero la aproximación es imperfecta, pero esta "tirada" de precisión permite típicamente una mejor compresión.

Aquí hay un ejemplo trivial de compresión sin pérdida: si tiene una imagen hecha de 1,000 píxeles negros, en lugar de almacenar el valor de negro 1,000 veces, puede almacenar un conteo (1000) y un valor (negro) comprimiendo así un pixel de 1000 " imagen "en solo dos números. (Esta es una forma cruda de un método de compresión sin pérdida llamado codificación de longitud de ejecución).


0