UNIX/Linuxの部屋 pngquantコマンドの使い方


※空白区切りで AND 検索 (例:「ファイル 削除」)

コマンド pngquant PNG ファイル容量・ファイルサイズ圧縮ツール

最終更新


pngquant コマンドは画像フォーマット PNG を減色することで、ファイル容量削減・ファイルサイズ縮小する圧縮ツールである。画質にうるさくない人が見ても、元のファイルとの違いをほぼ感じ取ることはできないであろう。UNIX/Linux に加え、Windows版・MacOS 版も提供されている。TinyPNG などの圧縮サービスはあるが、画像ファイルが手元に大量にある場合、コマンドラインからの一括圧縮ツールとして使うとよい。


pngquant コマンドの基本的な使い方
pngquant コマンドの基本的な使い方は下記のとおりである。
% pngquant image.png
→ image-fs8.png というファイルが生成される (元ファイルが残る)。
% pngquant *.png
→ 複数ファイルについて [元画像ファイル名]-fs8.png というファイルが生成される。
% pngquant dir/*.png
→ dir/ の下に、[元画像ファイル名]-fs8.png というファイルが生成される。
% pngquant --ext .png --force *.png
→ 元ファイルと同じファイル名で保存する (元ファイルは残らない)

いろいろパラメータをいじって画質確認するなど試行錯誤したいときは、カレントディレクトリに *.png を置き、newpng/ ディレクトリを作成した上で、
% ls *.png | sed 's|\(.*\)|pngquant --force -o newpng/\1 \1|'
pngquant --force -o newpng/img1.png img1.png
pngquant --force -o newpng/img2.png img2.png
pngquant --force -o newpng/img3.png img3.png
などと確認した上で、最後に "| sh" を付けて
% ls *.png | sed 's|\(.*\)|pngquant --force -o newpng/\1 \1|' | sh
で実行するのはどうかと提案する次第である。

PNG 画像圧縮の仕組み
PNG 画像はトゥルーカラーとして 24bit (1677万色) または 48bit (280兆色) のカラーを選択できるが、ほとんどのケースではそれほど多くの色を使うわけではない。一方、PNG にはインデックスカラーという、8bit (256色) だけを使うモードがある。

pngquant コマンドは、24bit または 48bit の画像を 8bit のインデックスカラーに減色するものである。また、インデックスカラーには 16色・4色・2色のパターンもあるので、可能であればそれらのより小さい色数に減色できないか試みる。

しかし単純に減色した場合、画像が汚く見えてしまうので、ディザリングという少ない色数で多くの色が存在するかのように見せる方法を使う (例えば、青と赤のドットを交互に置くと紫に見えるというのがディザリング)。pngquant のデフォルトでは「フロイド-スタインバーグ・ディザリング」という手法を使うが、対象画像により相性があるので (多分)、「オーダード・ディザリング」という手法を使うこともできる。

pngquant コマンドのオプション一覧
pngquant コマンドのオプション一覧を以下に示す。画質に関わるオプションとして、--floyd・--posterize・--quality・--speed があり、それぞれがどう機能するか大変わかりづらい。画質にうるさくない当ページ管理人の意見としては、「どうせ判別できないんだからデフォルトでいいんじゃない?」であるが、こだわりのある方は pngquant コマンドが使用している libimagequant というライブラリのマニュアルやソースを読んでいただきたい。

▷ --force
出力ファイルがすでに存在する場合、pngquant コマンドは警告を出してスキップするが、--force オプションを付けると上書きする。
▷ --ext [拡張子等]
--ext -new.png などとすると、image.png が image-new.png として保存される。
▷ --floyd [数字]
フロイド-スタインバーグ・ディザリングにおけるディザリングレベルを指定する。0〜1 の範囲で指定可能で、デフォルトは 1。0 は指定しない。--floyd 0.5 などと指定する。
▷ --iebug
IE6 における透過 PNG の表示バグに対応した画像を生成する。
▷ --nofs
ディザリング時に、フロイド-スタインバーグ・ディザリングを使わない。結果として、オーダード・ディザリングが使用される。この場合、デフォルトのファイル名は"-fs8.png" ではなく "-or8.png" となる。
▷ -o [出力ファイル名] または --output [出力ファイル名]
出力ファイル名を指定する。
% pngquant *.png
などと複数ファイルを対象として圧縮する場合、本オプションは使用できない。
▷ --posterize [数字]
画像ビット数を切り捨てる。[数字] には 0〜4 を指定可能で、0 はデフォルト (=切り捨てない)、1〜4 と数が大きくなるほど切り捨てビット数が多くなる。その分、画質は悪くなる。
▷ -Q [最小-最大] または --quality [最小-最大]
JPEG 圧縮率のような画質を 0〜100 で指定する。デフォルトは 100 (最高画質) である。
% pngquant --quality 0-50
% pngquant --quality 80-100
▷ --skip-if-larger
圧縮したファイルが元ファイルよりファイルサイズが大きい場合、そのファイルを生成しない。
▷ --strip
出力ファイル生成時に、元ファイルに含まれるメタデータをコピーしない。
▷ -s [数字] または --speed [数字]
圧縮スピードを 1〜11 を指定できる。1 が高圧縮率かつ最も遅く、11 が低圧縮だが速い。標準は 3 であるが、3 と比べると 10 の場合は 5% 画質が落ちるが 8倍速いとのこと。なお、11 はディザリングが無効になる。


頑張って書いたおすすめコンテンツ!
クラウドサービス徹底比較・徹底解説