PNG es la combinación de Filtros + LZ77 + Huffman (la combinación de LZ77 + Huffman se llama Deflate) en ese orden:
paso 1) si el filtro es diferente de Ninguno, el valor de los píxeles se reemplaza por la diferencia de los píxeles adyacentes (para obtener más detalles, consulte http://www.libpng.org/pub/png/book/chapter09.html ) . Eso aumenta la compresión de imágenes con gradientes (entonces ... 4 5 6 7 se convierte en ... 1 1 1 1) y puede ayudar en áreas del mismo color (... 3 3 3 5 5 5 5 5 se convierte en 0 0 0 2 0 0 0 0 0). Por defecto, los filtros están habilitados en imágenes de 24 bits y deshabilitados en imágenes de 8 bits con una paleta.
paso 2) los datos se comprimen con LZ77 que reemplaza cadenas repetidas (coincidencias) de bytes con una tupla que contiene la distancia a la coincidencia y la longitud de la coincidencia.
paso 3) el resultado del paso 2 se codifica con el código Huffman que reemplaza los símbolos de longitud fija con códigos de longitud variable, cuanto más frecuente sea el símbolo, más corto será el código.
Hay múltiples problemas:
Un pequeño cambio que afecta a pocos píxeles dará como resultado cambios en los resultados de los 3 pasos de la compresión png:
1) El valor filtrado de los píxeles adyacentes cambiará (según el filtro utilizado). Eso amplificará los efectos de pequeños cambios.
2) El cambio significará que las coincidencias con esa área serán diferentes. Por ejemplo, cambiar 333333 a 333533 hace que otra aparición de 333333 ya no coincida, por lo que seleccionará otra coincidencia a 333333 con una distancia diferente o seleccionará la misma coincidencia pero con una longitud más corta y luego otra coincidencia para los últimos 3 bytes. Por sí solo eso cambiará mucho los resultados.
3) El problema más grande está en el paso 3. El código huffman usa un número variable de bits, por lo que incluso un pequeño cambio dará como resultado que todo lo que sigue ya no esté alineado. AFAIK La mayoría de los algoritmos de compresión no pueden detectar coincidencias que no están alineadas en bytes, por lo que evitará (o al menos reducirá) la compresión de los datos ya comprimidos que siguen al cambio a menos que el compresor pueda detectar coincidencias que no estén alineadas en bytes.
Los otros problemas ya están cubiertos por otras respuestas:
4) Gzip usa el mismo algoritmo de desinflado con un diccionario de 32 KB, por lo que si los archivos png son más grandes que 32 KB, las coincidencias no se detectarán, incluso si son idénticas. Bzip2 es mejor en ese aspecto, ya que utiliza un bloque de 900 KB. XZ usa LZMA, que IIRC tiene un diccionario de 4 MB en el nivel de compresión predeterminado. 5) El formato Zip no utiliza compresión sólida, por lo que no comprimirá mejor archivos similares o idénticos.
Quizás los compresores de la familia PAQ o PPMD se comprimirán mejor, pero si necesita comprimir muchos archivos de imagen similares, puede considerar 3 enfoques:
1) Almacene las imágenes sin comprimir (con PNG -0 o en un formato sin compresión) y comprímalas con un compresor con un diccionario grande o un tamaño de bloque. (LZMA funcionará bien)
2) Otra opción sería mantener los filtros pero eliminar la compresión Deflate de los PNG. Eso se puede hacer, por ejemplo, con la utilidad ( AdvDef ). Luego comprime los PNG sin comprimir resultantes. Después de la descompresión, puede mantener el PNG sin comprimir o comprimirlo nuevamente con AdvDef (pero eso llevará tiempo).
Debe probar ambos enfoques para ver cuál comprime más.
3) La última opción sería convertir las imágenes png en un video, comprimirlo con un compresor de video sin pérdida como x264 sin pérdida (teniendo especial cuidado de usar el formato de color correcto) y luego, en la extracción, extraer los cuadros a imágenes png individuales. Eso se puede hacer con ffmpeg. También necesitaría mantener la asignación entre el número de fotograma y el nombre original.
Ese sería el enfoque más complejo, pero si los pngs son parte de una animación, puede ser el más efectivo. Sin embargo, necesitará un formato de video que admita transparencia si lo necesita.
Editar: También hay formato MNG si no se usa con frecuencia.