믿고 쓰는 MozJPEG
일단 JPEG는 큰 문제 없이 지속적으로 업데이트 되고 있는 MozJPEG를 사용할 것이다. MozJPEG는 Firefox로 유명한 Mozilla 재단에서 만들고 있는 JPEG 인코더이다. libjpeg-turbo에 몇 가지 패치를 추가한 프로젝트기에 깊은 작동 방식을 알고 싶다면 libjpeg-turbo 저장소를 참고하면 된다.
MozJPEG 옵션 선택하기
MozJPEG는 -quality 값(0-100)으로 최적화 정도를 결정하는데 기본값인 여러 장의 사진을 테스트 해본 결과 품질/용량의 trade-off를 고려할 때 80이 적당해 보여서 80을 사용하기로 결정했다.
압도적인 최적화의 pngquant
pngquant는 libimagequant를 기반으로 한 이미지 최적화 프로그램이다. median-cut 양자화에 기반해 24bit PNG 이미지를 8bit 또는 그 이하로 낮추는 프로그램이며 이미지에 사용된 색상의 수가 적을수록 극적인 최적화를 보여준다.
만약 median-cut 양자화가 궁금하다면 이 포스트를 pngquant의 설명은 여기서 볼 수 있다.
pngquant 옵션 선택하기
보유하고 있는 전자책 여러권을 스캔해 테스트를 진행해보았다.
시간
시간은 -speed
값이 2->3, 7->8, 그리고 9 이후에서 크게 감소하는 경향을 보인다.
용량
용량은 -speed
값이 1~9까지 변화할 때 거의 변화가 없지만 10일때 크게 증가하고 11일 때 다시 감소한다. 6개의 책에서 모두 같은 경향을 보이므로 최적화 알고리즘에 문제가 있어보인다.
결론
용량의 경우 -speed=10
을 제외한 후 가장 용량이 큰 -speed=11
조차 원본대비 최대 58% 최소 48% 정도로 줄여들고 시간 또한 엄청나게 줄어들기 때문에 -speed
값을 올려서 빠르게 처리하는 것이 현명한 선택으로 보인다.
추가적인 최적화는 Oxipng로
pngquant로 이미지 용량이 큰 근본적인 원인을 잡았다면 추가적인 최적화를 Oxipng로 진행하면 된다. 기존의 OptiPNG를 대체하는 프로젝트로 Rust로 작성되었고 멀티 코어를 지원한다.
Oxipng 옵션 선택
Oxipng는 -o N(0~6)으로 속도를 조정하는데 이미 pngquant에서 최적화를 크게 거쳐서 숫자를 올린다고 해도 큰 용량 하락이 발생하지 않기 때문에 0을 사용하기로 정했다.
유일한 선택지? Gifsicle
사실 GIF 자체가 효율과는 정반대에 있는 포맷이고 최적화 자체가 어려운 포맷이다. GIF는 최적화 보단 GIF 자체의 해상도를 줄이거나 프레임 수를 줄이는 것이 좋다.
그래도 찾아보니 무려 1997부터 만들어져 온 Gifsicle라는 최적화 프로그램이 있어 이것을 사용하기로 결정했다.
사실 Gifsicle는 최적화 말고도 여러 기능을 지원하는 프로그램이다
Gifsicle 옵션 선택
Gifsicle는 -ON과 --lossy N을 통해서 최적화 정도를 선택한다. 전자는 숫자가 높아도 시간이 크게 늘어나지 않아 3을 선택했고 --lossy는 80 밑으로 가면 슬슬 못 봐주겠는 수준이 되어서 80으로 선택했다.