PNG è la combinazione di Filtri + LZ77 + Huffman (la combinazione di LZ77 + Huffman si chiama Deflate) in questo ordine:
passaggio 1) se il filtro è diverso da Nessuno, il valore dei pixel viene sostituito dalla differenza dai pixel adiacenti (per maggiori dettagli consultare http://www.libpng.org/pub/png/book/chapter09.html ) . Ciò aumenta la compressione delle immagini con gradienti (quindi ... 4 5 6 7 diventa ... 1 1 1 1) e può aiutare in aree dello stesso colore (... 3 3 3 5 5 5 5 5 diventa 0 0 0 2 0 0 0 0 0). Per impostazione predefinita, i filtri sono abilitati nelle immagini a 24 bit e disabilitati nelle immagini a 8 bit con una tavolozza.
passaggio 2) i dati vengono compressi con LZ77 che sostituisce le stringhe ripetute (corrispondenze) di byte con una tupla contenente la distanza dalla corrispondenza e la lunghezza della corrispondenza.
passaggio 3) il risultato del passaggio 2 è codificato con il codice Huffman che sostituisce i simboli a lunghezza fissa con codici a lunghezza variabile, più frequente è il simbolo, più breve è il codice.
Esistono diversi problemi:
Una piccola modifica che influisce su pochi pixel comporterà modifiche nei risultati dai 3 passaggi della compressione png:
1) Il valore filtrato dei pixel adiacenti cambierà (a seconda del filtro utilizzato). Ciò amplificherà gli effetti di piccoli cambiamenti.
2) La modifica significherà che le corrispondenze a quell'area saranno diverse. Ad esempio, cambiando da 333333 a 333533, un'altra occorrenza di 333333 non corrisponderà più, quindi selezionerà un'altra corrispondenza su 333333 con una distanza diversa o selezionerà la stessa corrispondenza ma con una lunghezza più breve e quindi un'altra corrispondenza per gli ultimi 3 byte. Di per sé ciò cambierà molto i risultati.
3) Il problema più grande è nel passaggio 3. Il codice huffman utilizza un numero variabile di bit, quindi anche una piccola modifica comporterà che tutto ciò che segue non sarà più allineato. AFAIK La maggior parte degli algoritmi di compressione non è in grado di rilevare corrispondenze che non sono allineate a byte, quindi ciò impedirà (o almeno ridurrà molto) la compressione sui dati già compressi che seguono la modifica, a meno che il compressore non sia in grado di rilevare corrispondenze che non sono allineate a byte.
Le altre questioni sono già coperte da altre risposte:
4) Gzip utilizza lo stesso algoritmo Deflate con un dizionario da 32 KB, quindi se i file png sono più grandi di 32 KB le corrispondenze non verranno rilevate anche se sono identiche. Bzip2 è migliore in questo aspetto in quanto utilizza un blocco da 900 KB. XZ utilizza LZMA, che IIRC ha un dizionario da 4 MB nel livello di compressione predefinito. 5) Il formato zip non utilizza una compressione solida, quindi non comprime meglio file simili o identici.
Forse i compressori della famiglia PAQ o PPMD comprimeranno meglio, ma se è necessario comprimere molti file di immagini simili, è possibile prendere in considerazione 3 approcci:
1) Memorizza le immagini non compresse (con PNG -0 o in un formato senza compressione) e comprime con un compressore con un dizionario di grandi dimensioni o dimensioni del blocco. (LZMA funzionerà bene)
2) Un'altra opzione sarebbe mantenere i filtri ma rimuovere la compressione Deflate dai PNG. Questo può essere fatto ad esempio con l' utilità ( AdvDef ). Quindi comprimi i PNG non compressi risultanti. Dopo la decompressione puoi conservare il PNG non compresso o comprimerlo di nuovo con AdvDef (ma ci vorrà del tempo).
È necessario testare entrambi gli approcci per vedere quale comprime di più.
3) L'ultima opzione sarebbe quella di convertire le immagini png in un video, comprimerlo con un compressore video lossless come x264 lossless (prestando particolare attenzione all'uso del giusto formato colore) e quindi estrarre i frame in singole immagini png. Questo può essere fatto con ffmpeg. Dovresti anche mantenere la mappatura tra il numero di frame e il nome originale.
Questo sarebbe l'approccio più complesso ma se i png fanno tutti parte di un'animazione potrebbe essere il più efficace. Tuttavia avrai bisogno di un formato video che supporti la trasparenza se ne hai bisogno.
Modifica: esiste anche il formato MNG che non viene usato spesso.