압축 매개 변수가있는 PNG는 어떻게 손실이 없습니까?


156

PNG 파일은 무손실 압축을 사용한다고합니다. 그러나 김프 와 같은 이미지 편집기에서 이미지를 PNG 파일로 저장하려고 할 때마다 압축 매개 변수를 요청합니다. 압축 매개 변수는 0에서 9 사이입니다. 압축 매개 변수가 있으면 시각적 정밀도에 영향을 미칩니다. 압축 된 이미지는 어떻게 PNG를 무손실로 만드는가?

압축 매개 변수를 9로 설정 한 경우에만 무손실 동작이 발생합니까?


40
대부분의 무손실 압축 알고리즘에는 "출력 크기를 최소화하기 위해 얼마나 많은 노력을 기울여야하는지"슬라이더로 일반화되는 튜너 블 (사전 크기와 같은)이 있습니다. 이것은 ZIP, GZip, BZip2, LZMA, ...에 유효합니다.
Daniel B

20
질문은 다르게 언급 될 수 있습니다. 압축에서 품질이 손실되지 않으면 항상 가장 작은 크기를 생성하는 압축을 사용하지 않는 이유는 무엇입니까? 그러면 압축 및 압축 해제에 더 많은 RAM과 더 많은 CPU 시간이 필요하기 때문에 대답이됩니다. 때로는 더 빠른 압축을 원하고 압축 비율에 관심이 없습니다.
kasperd

14
PNG 압축은 ZIP 파일과 거의 동일합니다. 압축을 풀 수 있지만 압축을 풀면 정확한 파일을 다시 얻을 수 있으므로 손실이 없습니다.
mikebabcock

13
Zip 및 Rar와 같은 대부분의 압축 소프트웨어를 사용하면 "압축 수준"을 입력하여 더 작은 파일 <-> 더 짧은 시간 중에서 선택할 수 있습니다. 이러한 소프트웨어가 압축 중에 데이터를 삭제한다는 의미는 아닙니다. 이 설정 (GIMP, pngcrush 등)은 비슷합니다.
Salman A

2
@naxa : 무손실 png가 실제로 어떤 것인지에 대한 경고는 없습니다. 항상 100 % 무손실입니다. 이 기사는 일부 구형 브라우저가 감마 보정을 처리하기 위해 PNG 구현에 있던 버그에 대해서만 경고합니다. 그리고 색상을 CSS 색상 (감마 보정되지 않음)과 일치시켜야하는 경우에만 의미가 있습니다.
Pauli L

답변:


183

PNG는 무손실입니다. 김프는이 경우 가장 좋은 단어를 사용하지 않을 가능성이 높습니다. 이를 "압축 품질"또는 다른 말로 "압축 수준"이라고 생각하십시오. 압축률이 낮을수록 파일 크기가 커지지 만 제작 시간이 덜 걸리지 만 압축률이 높으면 파일 제작 시간이 오래 걸리는 작은 파일이 만들어집니다. 일반적으로 가장 높은 압축 수준으로 올라갈 때 감소하는 수익 (즉, 시간이 걸리는 시간에 비해 크기가 크게 감소하지는 않음)을 얻지 만 사용자에게 달려 있습니다.


42
또한 PNG 압축에는 실제로 조정 가능한 매개 변수가 많기 때문에 소스의 내용에 따라 양방향으로 조정하면 출력 크기가 줄어들 수 있습니다. 단순한 "더 나은"및 "나쁜"슬라이더보다 훨씬 복잡합니다. 일반적으로 너무 중요하지는 않지만 절대적으로 가장 작은 것을 원하면 pngcrush가능한 한 가장 작은 변형을 비교할 수 있는 도구를 사용 하십시오.

4
압축 수준이 높을수록 압축 시간이 증가하지만 압축 해제 에도 영향을 줍 니까?
Nolonar

10
@Nolonar 일반적으로 아니오; 압축 수준이 높을수록 압축 해제 시간이 줄어드는 데, 그 이유는 압축을 풀고 처리해야 할 데이터가 적기 때문입니다. 압축 시간이 길수록 압축 할 패턴을보다 철저히 찾아서 (과 단순화) 수행해야합니다.
솜털 같은

1
@fluffy LordNeckbeard의 답변은 가장 높은 압축률이 가장 낮은 압축 시간보다 디코딩하는 데 5 배 더 오래 걸렸습니다.
André Chalella '12

1
PNG, 이다 더 나은 압축 파일에 대한 더 압축 해제 시간이 꽤 일반적인. 문제는 PNG의 경우 파일 크기가 작아 질 때 압축 알고리즘을 반복해서 적용하는 것입니다. 크기가 커지면 적용을 중지합니다. 따라서 압축 알고리즘을 5 번 또는 6 번 적용 할 수 있습니다. 즉, 이미지를 표시하려면 파일을 5 번 또는 6 번 압축 해제해야합니다.
yo

213

PNG는 압축되었지만 무손실

압축 수준은 파일 크기와 인코딩 / 디코딩 속도 간의 균형입니다. 과도하게 일반화하기 위해 FLAC와 같은 비 이미지 형식도 비슷한 개념을 가지고 있습니다.

다른 압축 수준, 동일한 디코딩 된 출력

파일 크기는 다르지만 압축 수준이 다르기 때문에 실제 디코딩 된 출력은 동일합니다.

MD5 muxer 를 사용하여 디코딩 된 출력 의 MD5 해시를 비교할 수 있습니다 .ffmpeg

이것은 몇 가지 예와 함께 가장 잘 나타납니다.

PNG 파일을 만듭니다.

$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
  • 기본적으로 PNG 출력에 ffmpeg사용 -compression_level 100됩니다.

파일 크기 비교 :

$ du -h *.png
  228K    0.png
  4.0K    100.png

PNG 파일을 디코딩하고 MD5 해시를 표시하십시오.

$ ffmpeg -loglevel error -i 0.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

$ ffmpeg -loglevel error -i 100.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

두 해시가 동일하므로 디코딩 된 출력 (압축되지 않은 원시 비디오)이 정확히 동일하다는 것을 확신 할 수 있습니다.


26
+1은 ffmpeg가 png를 처리 할 수 ​​있다는 것을 몰랐습니다.
Lekensteyn

21
@Lekensteyn 스크린 샷만드는 데 좋습니다 . 30 초를 건너 뛰고 스크린 샷을 찍는 예 : 이미지에서 비디오ffmpeg -ss 30 -i input -vframes 1 output.png만들 거나 그 반대의 경우에도 좋습니다.
llogan

PNG를 렌더링해야 할 때마다 압축을 풀어야합니까? 그것이 사실 인 경우 때문에, 우리는해야합니다
akshay2000

디스크 나 캐시에서 파일을 다시 읽으면 압축을 풀어야합니다. 동일한 페이지 내에서 캐시는 압축 해제 된 버전을 재사용 할 수 있습니다.
David Mårtensson '11

1
@ akshay2000 PNG를 렌더링하는 프로그램 작동 방식에 따라 다릅니다. 일반적으로 파일은 디스크에서 읽히고 RAM에 압축 해제되고 버퍼링됩니다. RAM에 버퍼링되어 있으면 이미지를 다시 압축 해제 할 필요가 없습니다.
xZise 2

24

PNG 압축은 두 단계로 이루어집니다.

  1. 사전 압축은 범용 압축 알고리즘으로 압축 할 수 있도록 이미지 데이터를 재정렬합니다.
  2. 실제 압축은 DEFLATE에 의해 수행됩니다. DEFLATE는 중복 된 바이트 시퀀스를 짧은 토큰으로 대체하여이를 검색하고 제거합니다.

2 단계는 시간 / 자원이 많이 소요되는 작업이므로 기본 zlib 라이브러리 (원시 DEFLATE의 캡슐화)는 1 = 가장 빠른 압축, 9 = 가장 높은 압축, 0 = 압축 없음 범위의 압축 매개 변수를 사용합니다. 여기서 0-9 범위가 나오고 김프는 단순히 해당 매개 변수를 zlib로 전달합니다. 레벨 0에서 png는 실제로 동등한 비트 맵보다 약간 더 큽니다.

그러나 레벨 9는 zlib이 시도하는 "최고의"수준 일 뿐이며 여전히 타협 솔루션 입니다.
철저한 검색에 1000 배 더 많은 처리 능력을 사용 하려는 경우 zlib 대신 zopfli 를 사용하여 3 ~ 8 % 더 높은 데이터 밀도를 얻을 수 있습니다 .
압축은 여전히 ​​손실이 없으며 데이터의 최적의 DEFLATE 표현입니다. 이것은 zlib 호환 라이브러리의 한계에 도달하므로 PNG를 사용하여 얻을 수있는 진정한 "최상의"압축입니다.


2
참고 : 압축 해제 시간은 zopflipng를 사용할 때 압축 레벨 또는 반복 횟수에 관계없이 동일합니다.
Adria

16

PNG 형식의 기본 동기는 GIF뿐만 아니라 기본적으로 모든 측면에서 개선 된 GIF를 대체하는 것이 었습니다. 결과적으로 PNG 압축은 완전히 무손실입니다. 즉 GIF 및 대부분의 TIFF 형식과 마찬가지로 비트 단위로 원본 이미지 데이터를 정확하게 재구성 할 수 있습니다.

PNG는 2 단계 압축 프로세스를 사용합니다.

  1. 사전 압축 : 필터링 (예측)
  2. 압축 : DEFLATE ( wikipedia 참조 )

사전 압축 단계는 필터링이라고하며, 이는 주 압축 엔진이보다 효율적으로 작동 할 수 있도록 이미지 데이터를 가역적으로 변환하는 방법입니다.

간단한 예로, 바이트 시퀀스가 ​​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에 압축 매개 변수가있어 단일 픽셀의 손실없이 파일 크기를 크게 줄일 수 있다는 것입니다.

출처 :

Wikipedia Portable Network Graphics
libpng 문서 9 장-압축 및 필터링


1
압축 수준 설정이 필터 사용을 변경한다고 생각하지 않습니다. 레벨 1-9 설정은 아마도 zlib 압축 레벨 1-9를 선택하고 레벨 0은 수축 알고리즘이 전혀 사용되지 않음을 의미합니다. 대부분의 구현은 행당 필터를 변경하지 않지만 항상 경로 필터를 사용합니다.
Pauli L

@PauliL : PNG 압축 소프트웨어의 모든 비교에서 생성 된 이미지의 크기 간에는 큰 차이가 있기 때문에 동의하지 않습니다. 모든 제품이 동일한 라이브러리에 대해 동일한 매개 변수를 사용한 경우 모든 크기와 속도가 동일해야합니다.
harrymc

그러한 비교에 대한 링크가 있습니까?
Pauli L

@PauliL : 이 비교를 통해 빠른 검색이 이루어졌습니다 .
harrymc

@PauliL : zlib 압축 수준이 PNG 압축 수준의 영향을받는 것이 맞을 것입니다. 압축 도구가 정확히 무엇을하는지 문서화하지는 않았지만 그에 따라 대답을 수정했습니다. 크기가 가장 나쁜 도구에 대한 설명은 필터를 전혀 사용하지 않고 zlib 압축 만 사용한다는 것입니다.
harrymc

5

좋아, 나는 현상금에 너무 늦었지만 여기에 내 대답이 있습니다.

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를 참조하십시오 .


3

무손실 항목의 압축 수준은 항상 인코딩 리소스 (보통 시간, 때로는 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이 필요한 파일을 만들 수 있습니다.


Hmmmm 저는 무손실 압축을 보장하기 위해 드라이브 스테퍼 모터와 헤드를 직접 제어하는 ​​구현을 보았습니다. 고해상도 클럭 소스가 있으면 맨체스터 인코딩을 쉽게 이길 수 있습니다.
Joshua

@Joshua : 고밀도 물리적 스토리지 형식을 사용하는 것은 데이터 압축과
다릅니다

0

첫째, PNG는 항상 무손실입니다. 명백한 역설은 (모든 종류의 데이터에 대해) 두 가지 다른 종류의 압축이 가능하다는 사실에 기인합니다 : 손실과 무손실.

무손실 압축 은 다양한 트릭을 사용하여 데이터 (예 : 파일 크기)를 압축 하여 모든 것을 근사하지 않고 유지합니다. 결과적으로 무손실 압축은 실제로 압축하지 못할 수도 있습니다. (기술적으로 높은 엔트로피를 가진 데이터는 손실이없는 방법으로 압축하기가 매우 어렵거나 불가능할 수 있습니다.) 손실 압축 은 실제 데이터와 비슷하지만 근사값은 불완전하지만 정확도의 "이탈"은 일반적으로 더 나은 압축을 허용합니다.

무손실 압축의 간단한 예는 다음과 같습니다. 이미지를 1,000 개의 검은 색으로 저장하는 대신 1,000 개의 검은 색 픽셀로 만든 이미지가있는 경우 카운트 (1000)와 값 (검은 색)을 저장하여 1000 픽셀을 압축 할 수 있습니다. 이미지 "를 두 개의 숫자로 (런 길이 인코딩이라고하는 무손실 압축 방법의 조잡한 형식입니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.