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!