画像ファイルには人間の肉眼では違いがわからないような多くの情報、視覚や位置情報などを含んでいます。こういうデータは少ない枚数だと気になりませんが、何百枚と溜まってくると膨大な容量を占有してしまいます。
またウェブサイトにアップロードする際も画像の容量が大きいとページのロード時間も遅くなります。こうなるとサーチエンジンの評価も下がってしまうので下位に表示されることになってしまいます。
本ページでは画像データを圧縮せず(ロスレス)に最適化をしてくれるプログラムをご紹介します。スマホやデジカメで撮影した画像を劣化なしでおよそ 10〜15% ほど小さくすることができます。
Linux では JPEG画像ファイルは JpegOptim 、PNG画像ファイルは OptiPNG というプログラムで最適化ができます。コマンドラインだと大量のファイルを一つのコマンドで処理できるので便利です。
JPEGOptim
公式のリポジトリに入っているので JPEGOptim をインストールするだけです。
インストール
Arch 系
$ sudo pacman -S jpegoptim
Debian 系
$ sudo apt install jpegoptim
使い方
基本的な構文としては以下のように打ち込みます。
$ jpegoptim -d file.jpg
'-d'
オプションを付与することで元ファイルのバックアップを行うこともできます。
EXIF情報を削除する
--strip-all
オプションは位置情報や撮影に使用したカメラの情報など、付随情報をすべて削除します。
さらに –totals オプションをつけることによって平均圧縮率と合計で削減できた容量が表示されます。
$ jpegoptim --strip-all --totals *.JPG
ワイルドカード「*
」を使うことでディレクトリ内のすべての .jpg
拡張子ファイルを指定することができます。
実行例
サブ/ディレクトリ内以下すべてのJPEGを最適化
下記のコマンドは指定したディレクトリ/サブディレクトリ以下にあるすべての JPEG ファイルを見つけ出して最適化処理をします。
$ find /path/to/directory -type f -iname "*.jpg" -print0 | xargs -0 jpegoptim --strip-all --totals
find
コマンドで指定したディレクトリとそのサブディレクトリ内のすべてのファイルを検索します。-iname
オプションを使用することで拡張子の大文字小文字の区別なく検索することができます。
これは余計かもしれませんが、ディレクトリやファイル名に改行などの特殊文字が使われていたときの対策として、 -print0
と -0
オプションを使うことで find
コマンドと xarg
コマンド、それぞれの出力を NULL
で区切らせます。
並列処理をさせる
また xargs
コマンドに -P
オプションをつけ、 -n 1
オプションで1つ処理が完了するごとに jpegoptim
コマンドに処理を渡すようにすれば、複数の最適化処理を同時に行えるようになります。'number-of-prosess'
を並列処理するプロセスの数で置き換えて使います。
$ find /path/to/directory -type f -iname "*.jpg" -print0 | xargs -0 -P number-of-prosess -n 1 jpegoptim --strip-all --totals
下記のコマンドは4つのプロセスを同時に行えるコマンドです。
$ find /hoge/hoge/ -type f -iname "*.jpg" -print0 | xargs -0 -P 4 -n 1 jpegoptim --strip-all --totals
JPEGを圧縮する
JPEGOptim には圧縮する機能も備わっています。
'-m'
オプションを使うことで圧縮率を指定することができます。小さな値ほど圧縮率が高くなりますが画質も荒くなります。
$ jpegoptim -m 75 *.jpg
‘-s’ オプションは指定したファイルサイズに圧縮します。 下のコマンドはファイルサイズが 100KB にとどまるよう image.jpg を圧縮します。
$ jpegoptim -s 100k image.jpg
OptiPNG
こちらも JPEGOptim と一緒でほとんどのディストリビューションでは公式のリポジトリに入っています。
インストール
Arch 系
$ sudo pacman -S optipng
Debian 系
$ sudo apt install optipng
使い方
OptiPNG は基本的な使い方は JPEGoptim と一緒ですが、オプションが少々違うので --help
で詳細を参照したほうが良いでしよう。
-o1 オプションは最適化レベルを指定するものです。1〜7の数字を指定できます。高い数字ほど最適化の試行回数が多くなり、不要なデータが削減されますがその分処理に時間を要します。
$ optipng *.png -o1
ディレクトリ内のPNGファイルをすべて最適化
$ find /path/to/directory -type f -iname "*.png" -print0 | xargs -0 optipng -o7
おわり
コメント