pngquantを使ってpng画像を違和感少な目にサイズ圧縮する

pngquantを使ってpngファイルを違和感少な目にファイルサイズを小さくする。

概要

あのパンダの画像圧縮サイトtinyPngもこれが使っているアルゴリズムでサイズを圧縮しているらしい。7割くらいのサイズ削減が期待できる。

インストールはパッケージマネージャからできるはず:

apt install pngquant

使い方は、pngquantだけで実行すれば表示される以下に従う:

pngquant, 2.12.2 (July 2019), by Kornel Lesinski, Greg Roelofs.
   Compiled with no support for color profiles. Using libpng 1.6.37.

usage:  pngquant [options] [ncolors] -- pngfile [pngfile ...]
        pngquant [options] [ncolors] - >stdout <stdin

options:
  --force           overwrite existing output files (synonym: -f)
  --skip-if-larger  only save converted files if they're smaller than original
  --output file     destination file path to use instead of --ext (synonym: -o)
  --ext new.png     set custom suffix/extension for output filenames
  --quality min-max don't save below min, use fewer colors below max (0-100)
  --speed N         speed/quality trade-off. 1=slow, 4=default, 11=fast & rough
  --nofs            disable Floyd-Steinberg dithering
  --posterize N     output lower-precision color (e.g. for ARGB4444 output)
  --strip           remove optional metadata (default on Mac)
  --verbose         print status messages (synonym: -v)

Quantizes one or more 32-bit RGBA PNGs to 8-bit (or smaller) RGBA-palette.
The output filename is the same as the input name except that
it ends in "-fs8.png", "-or8.png" or your custom extension (unless the
input is stdin, in which case the quantized image will go to stdout).
If you pass the special output path "-" and a single input file, that file
will be processed and the quantized image will go to stdout.
The default behavior if the output file exists is to skip the conversion;
use --force to overwrite. See man page for full list of options.

--outputオプションは、入力ファイルが1つだけでないと以下のようなエラーが表示される。単体ごとに実行する必要がある:

pngquant --output dest/ ./tests/*.png
  error: Only one input file is allowed when --output is used. This error also happens when filenames with spaces are not in quotes.

使用例

特定ディレクトリの中のpngファイルを上書きしつつ変換するなら以下の実行で十分だ。数が多いと時間はかかる:

pngquant --ext .png --force --speed 1 ./tests/*.png

また、他のディレクトリへ移動させつつ変換するなら、先ほどの--outputを使ってこのようにできる:

find tests/ -type f -path "*.png" -exec bash -c 'pngquant --output "dest/$(basename "$0")" --speed 1 "$0"' "{}" \;

tests/dest/を適切に変える。

verboseで出力されるログ

-vオプションで記載される出力を記録しておく。一件ごとに以下のようなログが表示される:

./tests/untitled.png:
  read 1887KB file
  made histogram...2324 colors found
  selecting colors...5%
  selecting colors...35%
  selecting colors...70%
  selecting colors...100%
  moving colormap towards local minimum
  eliminated opaque tRNS-chunk entries...0 entries transparent
  mapped image to new colors...MSE=0.046 (Q=99)
  writing 256-color image as untitled-fs8.png
  copied 1KB of additional PNG metadata

うまく色を選択してサイズ圧縮していることがわかる。

おわり。Thnak you for reading!

タイトルとURLをコピーしました