PNG est la combinaison de filtres + LZ77 + Huffman (la combinaison de LZ77 + Huffman est appelée Deflate) dans cet ordre:
étape 1) si le filtre est différent de None, la valeur des pixels est remplacée par la différence avec les pixels adjacents (pour plus de détails, voir http://www.libpng.org/pub/png/book/chapter09.html ) . Cela augmente la compression des images avec des dégradés (donc ... 4 5 6 7 devient ... 1 1 1 1) et cela peut aider dans les zones de la même couleur (... 3 3 3 5 5 5 5 5 devient 0 0 0 2 0 0 0 0 0). Par défaut, les filtres sont activés dans les images 24 bits et désactivés dans les images 8 bits avec une palette.
étape 2) les données sont compressées avec LZ77 qui remplace les chaînes d'octets répétées (correspond) par un tuple contenant la distance jusqu'à la correspondance et la longueur de la correspondance.
étape 3) le résultat de l'étape 2 est codé avec un code Huffman qui remplace les symboles de longueur fixe par des codes de longueur variable, plus le symbole est fréquent, plus le code est court.
Il y a plusieurs problèmes:
Un petit changement qui affecte peu de pixels entraînera des changements dans les résultats des 3 étapes de la compression png:
1) La valeur filtrée des pixels adjacents changera (en fonction du filtre utilisé). Cela amplifiera les effets de petits changements.
2) Le changement signifie que les correspondances avec cette zone seront différentes. Par exemple, si vous changez 333333 en 333533, une autre occurrence de 333333 ne correspondra plus, il sélectionnera donc une autre correspondance avec 333333 avec une distance différente ou sélectionnera la même correspondance mais avec une longueur plus courte, puis une autre correspondance pour les 3 derniers octets. En soi, cela changera beaucoup les résultats.
3) Le problème le plus important est à l'étape 3. Le code huffman utilise un nombre variable de bits, donc même un petit changement entraînera que tout ce qui suit n'est plus aligné. AFAIK La plupart des algorithmes de compression ne peuvent pas détecter les correspondances qui ne sont pas alignées en octets, ce qui empêchera (ou du moins réduira beaucoup) la compression des données déjà compressées qui suit le changement, sauf si le compresseur peut détecter des correspondances non alignées en octets.
Les autres questions sont déjà couvertes par d'autres réponses:
4) Gzip utilise le même algorithme Deflate avec un dictionnaire de 32 Ko, donc si les fichiers png sont plus grands que 32 Ko, les correspondances ne seront pas détectées même si elles sont identiques. Bzip2 est meilleur à cet égard car il utilise un bloc de 900 Ko. XZ utilise LZMA, dont l'IIRC a un dictionnaire de 4 Mo dans le niveau de compression par défaut. 5) Le format Zip n'utilise pas de compression solide, il ne compressera donc pas mieux les fichiers similaires ou identiques.
Peut-être que les compresseurs de la famille PAQ ou PPMD se compresseront mieux, mais si vous devez compresser de nombreux fichiers d'images similaires, vous pouvez envisager 3 approches:
1) Stockez les images non compressées (avec PNG -0 ou dans un format sans compression) et compressez avec un compresseur avec un grand dictionnaire ou une taille de bloc. (LZMA fonctionnera bien)
2) Une autre option serait de conserver les filtres mais de supprimer la compression Deflate des PNGs. Cela peut être fait par exemple avec l' utilitaire ( AdvDef ). Ensuite, vous compressez les fichiers PNG non compressés résultants. Après la décompression, vous pouvez conserver le PNG non compressé ou les compresser à nouveau avec AdvDef (mais cela prendra du temps).
Vous devez tester les deux approches pour voir celle qui se comprime le plus.
3) La dernière option serait de convertir les images png dans une vidéo, de la compresser avec un compresseur vidéo sans perte comme x264 sans perte (en prenant particulièrement soin d'utiliser le bon format de couleur), puis d'extraire les images en images png individuelles. Cela peut être fait avec ffmpeg. Vous devez également conserver le mappage entre le numéro de trame et le nom d'origine.
Ce serait l'approche la plus complexe, mais si les pngs font tous partie d'une animation, elle peut être la plus efficace. Cependant, vous aurez besoin d'un format vidéo qui prend en charge la transparence si vous en avez besoin.
Edit: Il existe également le format MNG s'il n'est pas utilisé souvent.