PNG는 Filters + LZ77 + Huffman (LZ77 + Huffman의 조합을 Deflate라고 함)의 조합입니다.
1 단계) 필터가 없음과 다른 경우, 픽셀 값이 인접 픽셀과의 차이로 대체됩니다 (자세한 내용은 http://www.libpng.org/pub/png/book/chapter09.html 참조 ) . 그래디언트가있는 이미지의 압축이 증가하므로 (4 5 6 7은 ... 1 1 1 1이 됨) 동일한 색상의 영역에 도움이 될 수 있습니다 (... 3 3 3 5 5 5 5 5는 0이 됨) 0 2 0 0 0 0 0). 기본적으로 필터는 24 비트 이미지에서 활성화되고 팔레트가있는 8 비트 이미지에서 비활성화됩니다.
단계 2) 데이터는 LZ77으로 압축되어 반복되는 (일치하는) 바이트 문자열을 일치하는 거리와 일치하는 길이를 포함하는 튜플로 대체합니다.
단계 3) 단계 2의 결과는 고정 길이 심볼을 가변 길이 코드로 대체하는 허프만 코드로 인코딩되며, 심볼이 빈번할수록 코드는 짧아진다.
여러 가지 문제가 있습니다.
소수의 픽셀에 영향을주는 작은 변화는 3 단계의 png 압축 결과에서 변화를 가져옵니다.
1) 인접 픽셀의 필터링 된 값이 변경됩니다 (사용 된 필터에 따라 다름). 그것은 작은 변화의 영향을 증폭시킬 것입니다.
2) 변경 사항은 해당 지역과 일치하는 것이 다르다는 것을 의미합니다. 예를 들어, 333333을 333533으로 변경하면 333333의 다른 발생이 더 이상 일치하지 않으므로 거리가 다른 333333에 대한 다른 일치를 선택하거나 동일한 일치를 선택하지만 길이는 더 짧고 마지막 3 바이트에 대해서는 다른 일치를 선택합니다. 그 자체로 결과가 많이 바뀔 것입니다.
3) 가장 큰 문제는 3 단계입니다. 허프만 코드는 가변 비트 수를 사용하므로 약간만 변경해도 뒤 따르는 모든 것이 더 이상 정렬되지 않습니다. AFAIK 대부분의 압축 알고리즘은 바이트 정렬되지 않은 일치를 감지 할 수 없으므로 압축기가 바이트 정렬되지 않은 일치를 감지 할 수 없으면 변경을 따르는 이미 압축 된 데이터에 대한 압축을 방지 (또는 최소한 많이 감소)합니다.
다른 문제는 이미 다른 답변에서 다룹니다.
4) Gzip은 32KB 사전과 동일한 Deflate 알고리즘을 사용하므로 png 파일이 32KB보다 크면 일치하더라도 일치가 감지되지 않습니다. Bzip2는 900KB 블록을 사용하므로 이러한 측면에서 더 좋습니다. XZ는 LZMA를 사용하는데, IIRC는 기본 압축 수준에서 4MB 사전을 갖습니다. 5) Zip 형식은 압축을 사용하지 않으므로 유사하거나 동일한 파일을 더 잘 압축하지 않습니다.
PAQ 또는 PPMD 제품군의 압축기는 압축률이 높지만 유사한 이미지 파일을 많이 압축해야하는 경우 다음 3 가지 방법을 고려할 수 있습니다.
1) 이미지를 압축되지 않은 상태로 저장하고 (PNG -0 또는 압축없는 형식으로) 사전 또는 블록 크기가 큰 압축기로 압축합니다. (LZMA는 잘 작동합니다)
2) 다른 옵션은 필터를 유지하지만 PNG에서 수축 압축을 제거하는 것입니다. 예를 들어 ( AdvDef ) 유틸리티 를 사용하여 수행 할 수 있습니다 . 그런 다음 압축되지 않은 PNG를 압축합니다. 압축 해제 후 압축되지 않은 PNG를 유지하거나 AdvDef를 사용하여 다시 압축 할 수 있지만 시간이 오래 걸립니다.
어떤 압축 방식을 가장 많이 사용하는지 확인하려면 두 가지 접근 방식을 모두 테스트해야합니다.
3) 마지막 옵션은 비디오에서 png 이미지를 변환하고 x264 무손실 (올바른 색상 형식을 사용하여 특별한주의를 기울임)과 같은 무손실 비디오 압축기로 압축 한 다음 추출시 프레임을 개별 png 이미지로 추출하는 것입니다. 그것은 ffmpeg로 수행 할 수 있습니다. 또한 프레임 번호와 원래 이름 사이의 매핑을 유지해야합니다.
가장 복잡한 방법이지만 PNG가 모두 애니메이션의 일부인 경우 가장 효과적 일 수 있습니다. 그러나 필요한 경우 투명도를 지원하는 비디오 형식이 필요합니다.
편집 : 자주 사용하지 않는 MNG 형식도 있습니다.