새로운 이미지 포맷의 개발이 계속 시도되고 있지만, 여전히 이미지 표준은 jpeg와 png가 대세다.
그런데, 손실 압축인 jpeg와 달리 png는 비손실 압축이기 때문에 파일의 크기를 줄이는 것이 쉽지 않다.
(이를 해결하기 위해 손실 압축 개념을 도입한 pngquant가 있고, 굉장한 품질과 성능을 보여준다)
png는 마지막 단계에서 zlib를 이용해서 압축을 하는데, 파라미터를 통해 압축의 정도을 조정할 수 있다.
즉, 최대압축(9)을 지정하면 동일한 이미지를 조금 더 작은 크기에 저장할 수 있는 것이다.
그런데, zlib는 워낙에 널리 사용되는 라이브러리라 많은 변형이 있고, 이들을 통해 더 나은 결과를 얻을 수 있다.
대표적인 zlib의 변형은 아래와 같다.
- jtkukunas / zlib: Intel에서 근무하는 Jim Kukunas의 변형, 이하 kukunas
- madler / zlib: zlib 자체의 공동 개발자이자, PNG 개발에도 참여한 Mark Adler의 변형, 이하 madler, madlerE[각주:1]
- cloudflare / zlib: madler-zlib에 개선 사항 추가
이 쪽에 대해 좀 다른 접근으로는 OptiPNG라는 프로젝트가 있다.
png 파일을 정보의 손실 없이 재압축을 하는 것이다.
단, 이 쪽은 시간이 굉장히 오래 걸린다는 단점을 감수해야 한다.
png 압축에 이러한 방식들을 다양하게 적용하면서 어떤 방식이 적절한 시간에 좀 더 작은 파일을 생성하는지를 확인해봤다.
적용한 zlib는 원본 및 변형 모두 1.2.8이다.
테스트는 두 종류의 이미지 세트에 대해 동일한 조건에서 이미지를 읽었다 쓰는 것으로 진행했다.
기본압축(6), 최대압축(9) 및 최소압축(1) 후 OptiPNG를 실행한 결과에 대해 크기와 압축시간을 측정했다.
1. test case #1: jpeg 이미지 90장(397.7KB)을 재압축
첫번째 테스트 결과는 아래와 같다.
OptiPNG를 적용하는 경우는 일단 소요시간이 상당히 오래 걸린다.
아래 그래프에서 볼 수 있듯이 적용하지 않은 경우와 비교하면 시간이 3배~9배 정도 소요된다.
OptiPNG를 제외하고 소요시간을 보면 아래와 같다.
최대압축(9)에서 원본 및 Kukunas 버전에 비해 다른 버전들은 10초 정도 빠르게 처리했다.
kukunas 버전은 zlib보다 살짝 느린데, 이게 혹시 AMD CPU에서 돌린 게 원인인가 하는 근거 없는 의심[각주:2]이 살짝 들었다.
파일 크기는 아래와 같다.
큰 틀에서 볼 때는 최대 압축률과 OptiPNG의 차이가 그렇게 크지는 않아 보인다.
최대압축(9)과 OptiPNG 만을 뽑아서 보면 눈여겨 볼 부분이 생긴다.
무엇보다 OptiPNG 결과가 오히려 파일의 크기가 큰 경우가 생긴다는 점.
그리고, madler가 가장 작은 크기를 보여준다. 두번째로 작은 건 zlib으로 압축 후 OptiPNG 적용한 경우.
2. test case #2: jpeg 이미지 152장(228.3KB)을 재압축
역시 OptiPNG가 시간이 굉장히 오래 걸린다.
그리고, 최대압축에서 kukunas 버전의 시간이 더 오래 걸리는 건 여전하다.
OptiPNG를 제외하고 보면 아래와 같은데, kukunas 버전을 제외하면 소요시간은 1-2초 정도밖에 차이나지 않는다.
역시 기본압축과 나머지(최대압축, OptiPNG)의 크기 차이는 큰 편이다.
그런데, 기본압축을 제외하고 보면 앞의 테스트와는 다른 결과를 볼 수 있다.
OptiPNG의 파일 크기가 전체적으로 더 작다[각주:3]는 점.
그리고, 최대압축은 kukunas와 madler의 크기가 가장 작다.
3. 결론
저장 시간을 무한히(?) 사용할 수 있으면 표준 zlib으로 저장한 뒤에 OptiPNG를 사용하는 것이 최선이다.
이게 전체적으로는 가장 작은 크기의 파일을 생성해준다.
그리고, OptiPNG의 시간이 좀 부담스러워, 최대압축으로 저장한 경우에는 madler 버전이 만족스러운 결과를 보여준다.
표준압축에 비해선 두 배 정도의 시간이 소요되지만, 충분히 작은 크기의 파일을 생성해준다.
GIF 파일의 크기를 더 줄여보자 (0) | 2016.08.01 |
---|---|
jpeg의 영원한 떡밥 산술 부호화(arithmetic coding) (2) | 2016.04.14 |
이미지 처리를 병렬화할 때 성능 향상은 어느 정도? (2) | 2016.03.19 |
GIF 포맷으로도 true color 이미지를 저장할 수 있다! (0) | 2015.10.18 |
ImageMagick에서 선택한 기본 리샘플링 필터는? (0) | 2015.09.27 |