PNG 파일은 무손실 압축을 사용한다고합니다. 그러나 김프 와 같은 이미지 편집기에서 이미지를 PNG 파일로 저장하려고 할 때마다 압축 매개 변수를 요청합니다. 압축 매개 변수는 0에서 9 사이입니다. 압축 매개 변수가 있으면 시각적 정밀도에 영향을 미칩니다. 압축 된 이미지는 어떻게 PNG를 무손실로 만드는가?
압축 매개 변수를 9로 설정 한 경우에만 무손실 동작이 발생합니까?
PNG 파일은 무손실 압축을 사용한다고합니다. 그러나 김프 와 같은 이미지 편집기에서 이미지를 PNG 파일로 저장하려고 할 때마다 압축 매개 변수를 요청합니다. 압축 매개 변수는 0에서 9 사이입니다. 압축 매개 변수가 있으면 시각적 정밀도에 영향을 미칩니다. 압축 된 이미지는 어떻게 PNG를 무손실로 만드는가?
압축 매개 변수를 9로 설정 한 경우에만 무손실 동작이 발생합니까?
답변:
PNG는 무손실입니다. 김프는이 경우 가장 좋은 단어를 사용하지 않을 가능성이 높습니다. 이를 "압축 품질"또는 다른 말로 "압축 수준"이라고 생각하십시오. 압축률이 낮을수록 파일 크기가 커지지 만 제작 시간이 덜 걸리지 만 압축률이 높으면 파일 제작 시간이 오래 걸리는 작은 파일이 만들어집니다. 일반적으로 가장 높은 압축 수준으로 올라갈 때 감소하는 수익 (즉, 시간이 걸리는 시간에 비해 크기가 크게 감소하지는 않음)을 얻지 만 사용자에게 달려 있습니다.
pngcrush
가능한 한 가장 작은 변형을 비교할 수 있는 도구를 사용 하십시오.
압축 수준은 파일 크기와 인코딩 / 디코딩 속도 간의 균형입니다. 과도하게 일반화하기 위해 FLAC와 같은 비 이미지 형식도 비슷한 개념을 가지고 있습니다.
파일 크기는 다르지만 압축 수준이 다르기 때문에 실제 디코딩 된 출력은 동일합니다.
MD5 muxer 를 사용하여 디코딩 된 출력 의 MD5 해시를 비교할 수 있습니다 .ffmpeg
이것은 몇 가지 예와 함께 가장 잘 나타납니다.
$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
ffmpeg
사용 -compression_level 100
됩니다.$ du -h *.png
228K 0.png
4.0K 100.png
$ ffmpeg -loglevel error -i 0.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83
$ ffmpeg -loglevel error -i 100.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83
두 해시가 동일하므로 디코딩 된 출력 (압축되지 않은 원시 비디오)이 정확히 동일하다는 것을 확신 할 수 있습니다.
PNG 압축은 두 단계로 이루어집니다.
2 단계는 시간 / 자원이 많이 소요되는 작업이므로 기본 zlib 라이브러리 (원시 DEFLATE의 캡슐화)는 1 = 가장 빠른 압축, 9 = 가장 높은 압축, 0 = 압축 없음 범위의 압축 매개 변수를 사용합니다. 여기서 0-9 범위가 나오고 김프는 단순히 해당 매개 변수를 zlib로 전달합니다. 레벨 0에서 png는 실제로 동등한 비트 맵보다 약간 더 큽니다.
그러나 레벨 9는 zlib이 시도하는 "최고의"수준 일 뿐이며 여전히 타협 솔루션 입니다.
철저한 검색에 1000 배 더 많은 처리 능력을 사용 하려는 경우 zlib 대신 zopfli 를 사용하여 3 ~ 8 % 더 높은 데이터 밀도를 얻을 수 있습니다 .
압축은 여전히 손실이 없으며 데이터의 최적의 DEFLATE 표현입니다. 이것은 zlib 호환 라이브러리의 한계에 도달하므로 PNG를 사용하여 얻을 수있는 진정한 "최상의"압축입니다.
PNG 형식의 기본 동기는 GIF뿐만 아니라 기본적으로 모든 측면에서 개선 된 GIF를 대체하는 것이 었습니다. 결과적으로 PNG 압축은 완전히 무손실입니다. 즉 GIF 및 대부분의 TIFF 형식과 마찬가지로 비트 단위로 원본 이미지 데이터를 정확하게 재구성 할 수 있습니다.
PNG는 2 단계 압축 프로세스를 사용합니다.
사전 압축 단계는 필터링이라고하며, 이는 주 압축 엔진이보다 효율적으로 작동 할 수 있도록 이미지 데이터를 가역적으로 변환하는 방법입니다.
간단한 예로, 바이트 시퀀스가 1에서 255로 균일하게 증가하는 것을 고려하십시오.
1, 2, 3, 4, 5, .... 255
시퀀스에 반복이 없기 때문에 압축이 매우 열악하거나 전혀 압축되지 않습니다. 그러나 시퀀스의 사소한 수정, 즉 첫 번째 바이트 만 남겨두고 각 후속 바이트를 이전 바이트와의 차이로 대체하면 시퀀스가 매우 압축 가능한 세트로 변환됩니다.
1, 1, 1, 1, 1, .... 1
위의 변환은 바이트가 생략되지 않았기 때문에 손실이 없으며 완전히 가역적입니다. 이 시리즈의 압축 크기는 훨씬 줄어들지 만 원본 시리즈는 여전히 완벽하게 재구성 할 수 있습니다.
실제 이미지 데이터는 그다지 완벽하지는 않지만 필터링은 그레이 스케일 및 트루 컬러 이미지의 압축률을 향상 시키며 일부 팔레트 이미지에도 도움이됩니다. PNG는 5 가지 유형의 필터를 지원하며 인코더는 이미지의 각 픽셀 행에 대해 서로 다른 필터를 사용하도록 선택할 수 있습니다.
이 알고리즘은 바이트에서 작동하지만 큰 픽셀 (예 : 24 비트 RGB 또는 64 비트 RGBA)의 경우 해당 바이트 만 비교되므로 픽셀 색상의 빨간색 구성 요소는 녹색 및 파란색 픽셀 구성 요소와 별도로 처리됩니다.
각 행에 가장 적합한 필터를 선택하려면 인코더가 가능한 모든 조합을 테스트해야합니다. 20 행 이미지라도 95 조 이상의 조합을 테스트해야하므로 "테스트"는 전체 이미지를 필터링하고 압축해야합니다.
압축 수준은 일반적으로 0 (없음)에서 9 (최고) 사이의 숫자로 정의됩니다. 이것은 속도와 크기 사이의 절충을 의미하며 시도 할 행 필터 조합 수와 관련이 있습니다. 이러한 압축 수준에 관한 표준은 없으므로 모든 이미지 편집기에는 이미지 크기를 최적화 할 때 시도 할 필터 수에 대한 자체 알고리즘이있을 수 있습니다.
압축 수준 0은 필터가 전혀 사용되지 않으므로 빠르지 만 낭비입니다. 레벨이 높을수록 이미지 행에서 점점 더 많은 조합이 시도되고 최상의 조합 만 유지됩니다.
최고의 압축에 대한 가장 간단한 접근 방식은 각 필터로 각 행을 증분 테스트 압축하고 가장 작은 결과를 저장 한 후 다음 행에 대해 반복하는 것입니다. 이는 전체 이미지를 5 번 필터링 및 압축하는 것과 관련이 있으며, 이는 여러 번 전송 및 디코딩 될 이미지에 대한 합리적인 절충 일 수 있습니다. 도구 개발자의 재량에 따라 압축 값이 낮을수록 성능이 떨어집니다.
필터 외에도 압축 레벨은 zlib 압축 레벨에 영향을 줄 수 있으며 이는 0 (Deflate 없음)과 9 (maximum Deflate) 사이의 숫자입니다. 지정된 0-9 레벨이 PNG의 주요 최적화 기능인 필터 사용에 미치는 영향은 여전히 도구 개발자에게 달려 있습니다.
결론은 PNG에 압축 매개 변수가있어 단일 픽셀의 손실없이 파일 크기를 크게 줄일 수 있다는 것입니다.
출처 :
좋아, 나는 현상금에 너무 늦었지만 여기에 내 대답이 있습니다.
PNG는 항상 무손실 입니다. zip 프로그램에서 사용되는 것과 유사한 Deflate / Inflate 알고리즘을 사용합니다.
Deflate 알고리즘은 반복되는 바이트 시퀀스를 검색하여 태그로 바꿉니다. 압축 레벨 설정은 프로그램이 바이트 시퀀스의 최적 조합을 찾기 위해 얼마나 많은 노력을 기울이고 있는지, 그리고이를 위해 예약 된 메모리 양을 지정합니다. 시간과 메모리 사용량과 압축 파일 크기가 서로 맞지 않습니다. 그러나 최신 컴퓨터는 속도가 빠르고 메모리가 충분하여 최고 압축 설정 이외의 다른 것을 사용할 필요가 없습니다.
많은 PNG 구현은 압축을 위해 zlib 라이브러리를 사용합니다. Zlib의 압축 수준은 1-9입니다. 나는 Gimp의 내부를 모르지만 압축 수준 설정이 0-9 (0 = 압축 안 됨)이기 때문에이 설정이 zlib의 압축 수준을 단순히 선택한다고 가정합니다.
Deflate 알고리즘은 범용 압축 알고리즘 이며 사진 압축 용으로 설계되지 않았습니다. 대부분의 다른 무손실 이미지 파일 형식과 달리 PNG 형식은이 형식으로 제한되지 않습니다. PNG 압축은 우리가 2D 이미지를 압축한다는 지식을 이용 합니다 . 이것은 소위 필터에 의해 달성됩니다 .
(여기서 필터는 실제로 약간 오해의 소지가있는 용어입니다. 실제로 이미지 내용을 변경하지 않고 다르게 코딩합니다. 더 정확한 이름은 델타 인코더입니다.)
PNG 사양은 5 가지 필터를 지정합니다 (0 = 없음 포함). 필터는 절대 픽셀 값 을 이전 픽셀 과 왼쪽, 위, 대각선 또는 이들의 조합으로 차이로 바꿉니다 . 압축 비율이 크게 향상 될 수 있습니다. 이미지의 각 스캔 라인은 다른 필터를 사용할 수 있습니다. 인코더는 각 라인에 가장 적합한 필터를 선택하여 압축을 최적화 할 수 있습니다.
PNG 파일 형식에 대한 자세한 내용은 PNG 사양을 참조하십시오 .
사실상 무한한 수의 조합이 있기 때문에 모두 시도 할 수는 없습니다. 따라서 효과적인 조합을 찾기위한 다양한 전략이 개발되었습니다. 대부분의 이미지 편집기는 필터를 한 줄씩 최적화하지 않고 고정 필터 (대부분 Paeth)를 사용했습니다.
명령 행 프로그램 pngcrush 는 최상의 결과를 찾기 위해 몇 가지 전략을 시도합니다. 다른 프로그램으로 만든 PNG 파일의 크기를 크게 줄일 수 있지만 더 큰 이미지에서는 시간이 약간 걸릴 수 있습니다. Source Forge-pngcrush를 참조하십시오 .
무손실 항목의 압축 수준은 항상 인코딩 리소스 (보통 시간, 때로는 RAM) 대 비트 전송률을 거래하는 것입니다. 품질은 항상 100 %입니다.
물론 무손실 압축기는 실제 압축을 보장 할 수 없습니다. 임의의 데이터는 압축 할 수 없으며 찾을 패턴과 유사성이 없습니다. 섀넌 정보 이론과 그 모든 것. 무손실 데이터 압축의 요점은 인간이 일반적으로 비 랜덤 데이터로 작업하지만 전송 및 저장을 위해 가능한 한 적은 비트로 압축 할 수 있다는 것입니다. 원래 Kolmogorov의 복잡성 에 최대한 가깝게 가까이 있기를 바랍니다 .
zip 또는 7z 일반 데이터, png 이미지, flac 오디오 또는 h.264 (무손실 모드) 비디오에 관계없이 동일합니다. lzma (7zip) 및 bzip2와 같은 일부 압축 알고리즘의 경우 압축 설정을 크랭크하면 DECODER의 CPU 시간 (bzip2)이 증가하거나 필요한 RAM 양만 증가합니다 (lzma 및 bzip2 및 더 많은 참조 프레임이있는 h.264) . 다음 바이트를 디코딩하면 수 메가 바이트 전에 디코딩 된 바이트를 참조 할 수 있기 때문에 디코더는 종종 더 많은 디코딩 된 출력을 RAM에 저장해야합니다 (예 : 0.5 초 전에 1과 가장 유사한 비디오 프레임은 12 프레임을 참조하여 인코딩 됨) ). bzip2와 같은 것과 큰 블록 크기를 선택하지만 압축이 느려집니다. lzma 에는 가변 크기 사전이 있으며 1이 필요한 파일을 만들 수 있습니다.
첫째, PNG는 항상 무손실입니다. 명백한 역설은 (모든 종류의 데이터에 대해) 두 가지 다른 종류의 압축이 가능하다는 사실에 기인합니다 : 손실과 무손실.
무손실 압축 은 다양한 트릭을 사용하여 데이터 (예 : 파일 크기)를 압축 하여 모든 것을 근사하지 않고 유지합니다. 결과적으로 무손실 압축은 실제로 압축하지 못할 수도 있습니다. (기술적으로 높은 엔트로피를 가진 데이터는 손실이없는 방법으로 압축하기가 매우 어렵거나 불가능할 수 있습니다.) 손실 압축 은 실제 데이터와 비슷하지만 근사값은 불완전하지만 정확도의 "이탈"은 일반적으로 더 나은 압축을 허용합니다.
무손실 압축의 간단한 예는 다음과 같습니다. 이미지를 1,000 개의 검은 색으로 저장하는 대신 1,000 개의 검은 색 픽셀로 만든 이미지가있는 경우 카운트 (1000)와 값 (검은 색)을 저장하여 1000 픽셀을 압축 할 수 있습니다. 이미지 "를 두 개의 숫자로 (런 길이 인코딩이라고하는 무손실 압축 방법의 조잡한 형식입니다).