이미지 압축 유틸리티 pngquant 옵션 10가지 소개

이미지 용량 때문에 고민하시는 분들 계시죠? 특히 SEO 최적화를 하시거나, 게임을 제작하는 분들의 경우에는 무엇보다도 용량 최소화 해야겠죠? 이미지 압축 유틸리티 pngquant를 소개합니다.

pngquant란?

pngquant는 Kornel Lesiński를 주축으로 여러 기여자들과 더불어 제작한 libimagequant 라이브러리에 기반한 손실 PNG 압축 프로그램입니다. 기본적으로 이미지에 손실을 발생시키면서 용량을 줄이는 구조입니다. 24비트나 32비트의 PNG 파일보다 효율적이면서도 알파채널이 있는 8비트 PNG 포맷으로 변환하면서 이미지에 일부 손실을 통해 용량의 60~80% 가량을 줄일 수 있습니다. 압축된 이미지는 표준을 준수하며 웹 브라우저와 운영체제에서 모두 사용 가능합니다.

pngquant 적용 프로그램

GUI 프로그램 종류

아쉽게도 pngquant를 이용한 Linux용 GUI 어플리케이션은 없었습니다만, MacOS와 Windows 용으로는 사용할 수 있는 것들로 ImageOptim, Pngyu, PNGoo 그리고 Adobe Photoshop용 Plug-in SuperPNG가 있습니다.

그림 1. 이미지 압축 유틸리티 pngquant가 적용된 Mac용 Widnows용 GUI 어플리케이션
그림 1. 이미지 압축 유틸리티 pngquant가 적용된 Mac용 Widnows용 GUI 어플리케이션

Command-line 용 어플리케이션

Ubuntu

우분투에서는 아래 명령어 한 줄로 유틸리티를 설치할 수 있습니다.

sudo apt install pngquant
ShellScript

MAC, Windows

MacOS용 그리고 Windows용 바이너리는 pngquant 홈페이지에서 다운 받을 수 있습니다.

소스 코드 빌드

pngquant의 github에서 소스 코드를 받아서 직접 컴파일 할 수도 있습니다. 꼭 그래야만 하는 경우가 아니면 그냥 배포판을 이용하시기를 권합니다.

사용방법

GUI용 어플리케이션에 대한 설명은 생략하겠습니다. 여기에서는 cli용 어플리케이션 pngquant의 옵션에 대해서 함께 살펴보겠습니다.

도움말

우선 아래와 같이 입력하면 모든 옵션에 대한 설명을 확인할 수 있습니다. pngquant라고만 입력해도 설명은 확인할 수 있습니다. -h 대신에 –help도 사용 가능합니다.

pngquant -h
ShellScript

–ext 확장자 옵션

–ext 옵션을 사용하면 기존 파일 이름 뒤에 변환한 파일 이름의 확장자를 결정합니다. –ext -new.png와 같은 옵션으로 추가해 주면, 예를 들어서 원본 이미지 파일이 abcd.png인 경우 abcd-new.png의 형식으로 변환된 결과를 저장하게 됩니다.

–quality min-max 또는 -Q min-max

min과 max는 0(최악)에서 100(완벽)의 값을 갖습니다. max값은 이미지 품질을 충족시키거나 초과하는데 필요한 최소한의 색상을 사용하도록 합니다. 그리고 변환 결과가 min 값의 퀄리티 보다도 좋지 않으면 저장되지 않으며 상태 값 99와 함께 종료됩니다. 이를테면 –quality=65-80 처럼 사용할 수 있습니다.

–speed N 옵션

N은 1에서 10까지의 값을 가지며, 1은 가장 고품질의 결과를 만들어내는대신 속도가 느리고, 10은 품질이 5% 더 낮은 대신 속도는 8배 빠릅니다. 11은 디더링을 비활성화하고 압축 수준을 낮춥니다. 즉, 속도와 품질 간에 트레이드 오프가 발생합니다.

–strip 옵션

선택형의 메타데이터를 제거합니다.

–nofs 옵션

Floyd-Steinberg 디더링을 비활성화합니다.

–floyd=N 옵션

디더링의 수준을 설정할 수 있습니다. N은 0은 디더링을 하지 않는 것이며 1은 디더링을 최대로 하는 것입니다. = 표시를 꼭 넣어주셔야 합니다. 그리고 N 값은 0부터 1 사이의 소수점을 가진 값으로 설정할 수 있습니다.

–posterize bits 옵션

채널 당 색상의 최하위 비트 몇 개를 자를 것인지 설정할 수 있습니다. 이미지 심도가 낮은 화면에 표시될 때 사용합니다. pngquant는 거의 불투명한 픽셀은 완전히 불투명하게 만들고, 반투명한 색상의 양을 줄여줍니다. bits 값은 0부터 4까지 사용할 수 있습니다. 4인 경우에 많이 잘려나가니까 이미지에 손상이 많이 생깁니다. 대신에 용량은 줄어듭니다.

–force 옵션

출력 파일이 존재하는 경우에 덮어 씌웁니다.

–skip-if-larger 옵션

변환 결과 원본 파일보다 더 큰 파일이 만들어지면 이미지를 저장하지 않습니다.

옵션의 사용례

색상 수를 64로 줄여서 이미지 압축

아래와 같이 적어주면 결과 이미지는 64개의 색상을 갖는 이미지로 저장됩니다. 확장자를 지정하지 않았기 때문에 image-fs8.png로 저장됩니다.

pngquant 64 image.png
ShellScript

품질 괜찮으면 이미지 압축해서 원본에 덮어씌우기

너무 많은 품질 손실 없이 축소할 수 있다면 원본에 그냥 덮어씌우는 명령어입니다.

pngquant -f --ext .png --quality 70-95 image.png
ShellScript

까다로운 설정으로 가장 원하는 결과 만들기

품질은 큰 손실 없이 그리고 디더링은 중간 정도로 하고, 최하위 1비트를 잘라주고, 압축은 최대로 하고 싶으며, 색상은 128색으로 하고 싶고, 변환된 파일의 확장자는 image-re.png가 되게 하고 싶으며, 여러 번 출력해도 같은 파일에 덮어씌워지게 하려면 다음과 같은 명령어를 실행하면 됩니다.

pngquant -f \
  --ext -re.png \
  --quality 70-95 \
  --posterize 1 \
  --floyd=0.5 \
  --speed 1 \
  128 image.png
ShellScript

어떻게 하는 게 가장 좋을지 모르겠지만, 잘 조정해 보면 tinyPNG와 같은 서비스와 비슷한 수준까지 만들어 낼 수 있는 것 같습니다.

pngquant를 이용한 이미지 압축 적용 사례

위에 있는 것이 이미지 압축한 것이고, 아래의 것은 원본이미지입니다.

저는 이 이미지의 경우에 들어간 색상도 별로 없고 간단하다고 생각해서 pngquant 32 image.png라고 실행했는데 이런 결과가 나왔습니다. 색상이 많이 표현될 필요가 없는 이미지의 경우에는 색상 수를 낮춰서 이미지 압축을 해도 큰 무리가 없어보입니다. 용량이 정말 획기적으로 줄어서 약 23% 수준까지 줄어들었네요.

그림 2. 이미지 압축을 적용한 것과 적용하지 않은(원본) 이미지 비교
그림 2. 이미지 압축을 적용한 것과 적용하지 않은(원본) 이미지 비교

참고 자료

pngquant 홈페이지를 참고하시면 자세한 내용 확인 가능합니다.
Lou Park님의 블로그에 손실 압축 프로그램 TinyDoge를 제작한 회고 기록이 있습니다.

함께 읽으면 좋은 글