JPEGのロスレス圧縮やファイルサイズを指定して圧縮可能なJpegoptimをUbuntuで使う方法

公開日:2019/07/23 更新日:2019/07/23
JPEGのロスレス圧縮やファイルサイズを指定して圧縮可能なJpegoptimをUbuntuで使う方法のサムネイル

はじめに

JPEGファイルのロスレス圧縮やファイルサイズを指定して圧縮できるコマンドラインツールであるJpegoptimをUbuntuにインストールする手順と簡単な使い方をまとめます。

Jpegoptimについて

Jpegoptimは、JPEGファイルのロスレス圧縮やロスありの通常の圧縮を行うツールです。コマンドラインツールであり、色々なオプションが用意されています。詳しくは後述します。 Ubuntuではaptコマンドから簡単にインストールできます。以下が公式リポジトリです。

github.com

jpegoptim - utility to optimize/compress JPEG files

前提と環境

この記事ではUbuntuにてJpegoptimを使用しましたが、JpegoptimはDebian、Ubuntu、Mac OS Xに対応しています。

  • OS : Ubuntu18.04

Jpegoptimをインストールする

apt経由でインストール可能です。まずupdateしてインストールします。

$ sudo apt update
$ sudo apt install jpegoptim

以下のようにヘルプが表示されれば無事にインストールが完了していることを確認できます。

$ jpegoptim --help
jpegoptim v1.4.4  Copyright (c) 1996-2016, Timo Kokkonen
Usage: jpegoptim [options] <filenames> 

  -d<path>, --dest=<path>
                    specify alternative destination directory for 
                    optimized files (default is to overwrite originals)
  -f, --force       force optimization
  -h, --help        display this help and exit
  -m<quality>, --max=<quality>
                    set maximum image quality factor (disables lossless
                    optimization mode, which is by default on)
                    Valid quality values: 0 - 100
  -n, --noaction    don't really optimize files, just print results
  -S<size>, --size=<size>
                    Try to optimize file to given size (disables lossless
                    optimization mode). Target size is specified either in
                    kilo bytes (1 - n) or as percentage (1% - 99%)
  -T<threshold>, --threshold=<threshold>
                    keep old file if the gain is below a threshold (%)
  -b, --csv         print progress info in CSV format
  -o, --overwrite   overwrite target file even if it exists (meaningful
                    only when used with -d, --dest option)
  -p, --preserve    preserve file timestamps
  -P, --preserve-perms
                    preserve original file permissions by overwriting it
  -q, --quiet       quiet mode
  -t, --totals      print totals after processing all files
  -v, --verbose     enable verbose mode (positively chatty)
  -V, --version     print program version

  -s, --strip-all   strip all markers from output file
  --strip-none      do not strip any markers
  --strip-com       strip Comment markers from output file
  --strip-exif      strip Exif markers from output file
  --strip-iptc      strip IPTC/Photoshop (APP13) markers from output file
  --strip-icc       strip ICC profile markers from output file
  --strip-xmp       strip XMP markers markers from output file

  --all-normal      force all output files to be non-progressive
  --all-progressive force all output files to be progressive
  --stdout          send output to standard output (instead of a file)
  --stdin           read input from standard input (instead of a file)

Jpegoptimを使ってロスレス圧縮を行う

以下のようにjpegoptimコマンドに圧縮したいJPEGファイルを渡すことで圧縮してくれます。ただし、以下のコマンドではtest.jpgは圧縮されて上書きされ、元のファイルは残りません。

$ jpegoptim test.jpg
test.jpg 6016x4016 24bit N ICC JFIF  [OK] 7974779 --> 7862885 bytes (1.40%), optimized.

もし圧縮対象のJPEGファイルがこれ以上圧縮できない場合は、以下のように実行してもskippedと表示されます。

$ jpegoptim test2.jpg 
test2.jpg 4239x2593 24bit N ICC JFIF  [OK] 3494179 --> 3494195 bytes (-0.00%), skipped.

どれぐらい圧縮できるかを事前に確認する

以下のように-nオプションを使用することで、実際には圧縮せずにまずどれぐらい圧縮できるかを確認することができます。

$ jpegoptim -n test.jpg 
test.jpg 6016x4016 24bit N ICC JFIF  [OK] 7974779 --> 7862885 bytes (1.40%), optimized.

上記のように、1.40%と圧縮できる%が表示されます。実際には圧縮はされておらず元のJPEGファイルはそのまま残っており何も新しく作成されません。

指定したディレクトリに圧縮したファイルを作成する

圧縮したファイルを元のファイルに上書きするのではなく指定したディレクトリに作成したい場合は、-dオプションを使用します。

$ jpegoptim -d ./mydir test.jpg 
jpegoptim: skipping directory: ./mydir
test.jpg 6016x4016 24bit N ICC JFIF  [OK] 7974779 --> 7862885 bytes (1.40%), optimized.

上記の場合は、./mydirディレクトリに圧縮したJPEGファイルを元のJPEGファイルと同じファイル名で作成します。

Jpegoptimを使ってロスあり圧縮を行う

ロスあり圧縮ももちろん可能で、フィルサイズを指定もしくは元ファイルサイズのパーセンテージを指定して圧縮できます。 以下のように--sizeオプションの後に具体的なファイルサイズをキロバイトで指定して圧縮可能です。

$ jpegoptim --size=1000k small.jpg 
small.jpg 6016x4016 24bit N ICC JFIF  [OK] 7862885 --> 1048817 bytes (86.66%), optimized.

同じく--sizeオプションにパーセント値を指定して圧縮可能です。パーセント値を50%とすれば、元ファイルサイズの50%のファイルサイズに圧縮します。

$ jpegoptim --size=50% small.jpg
small.jpg 4239x2593 24bit N ICC JFIF  [OK] 3494179 --> 1740804 bytes (50.18%), optimized.

画質を落として圧縮する

ロスありの場合は、-mオプションを使用して画質を落とすこともできます。 0〜100の値を-mオプションにつけて使います。以下は値を10に設定しています。

$ jpegoptim -d ./mydir -o -m10 grape-sample.jpg 
jpegoptim: skipping directory: ./mydir
grape-sample.jpg 2048x1536 24bit N ICC JFIF  [OK] 418202 --> 69885 bytes (83.29%), optimized.

上記は-dオプションも合わせて使用しています。ここの画質というのはどういうことかというと、以下のサンプルを見るのが早いと思うので例を載せます。クリックして拡大するとより違いが分かると思います。以下のぶどうの写真は、UnsplashにあったMarius Ciocirlanさんの写真を使用させて頂いています。ありがとうございます。

marius-ciocirlan-Llqq7lv-Rjk-unsplash.jpg

圧縮前の元ファイル

grape-sample.jpg

画質を10まで落として圧縮したファイル
Photo by Marius Ciocirlan on Unsplash

複数ファイルを一括処理する

複数ファイルを指定したり、後はJPEGの拡張子ファイルをまとめて一括して処理することもできます。以下のように単純に圧縮したいファイルを連続して指定すればOKです。

$ jpegoptim sample1.jpg sample2.jpg 
sample1.jpg 6016x4016 24bit N ICC JFIF  [OK] 7974779 --> 7862885 bytes (1.40%), optimized.
sample2.jpg 6016x4016 24bit N ICC JFIF  [OK] 7974779 --> 7862885 bytes (1.40%), optimized.

複数ファイルを指定した場合でも他のオプションを一緒に使用できます。例えば以下は指定したディレクトリ先に圧縮したファイルを指定した分だけ作成します。

$ jpegoptim -d ./mydir sample1.jpg sample2.jpg 
jpegoptim: skipping directory: ./mydir
sample1.jpg 6016x4016 24bit N ICC JFIF  [OK] 7974779 --> 7862885 bytes (1.40%), optimized.
sample2.jpg 6016x4016 24bit N ICC JFIF  [OK] 7974779 --> 7862885 bytes (1.40%), optimized.

また、以下のように指定すれば現在のディレクトリ直下にある全てのJPEGファイルを圧縮して上書きします。

$ jpegoptim *.jpg

圧縮時にJPEGファイルの情報を削除する

--strip-exif.オプションを使用すると、JPEGファイルのEXIF情報を削除して圧縮します。

$ jpegoptim --strip-exif test.jpg 
test.jpg 4032x3024 24bit N Exif JFIF  [OK] 1891343 --> 1815935 bytes (3.99%), optimized.

EXIF情報以外にも、ICC(カラープロファイル)なども削除できます。もし全てのメタ情報を削除したい場合は、以下のように--strip-allを使用します。

$ jpegoptim --strip-all test.jpg 

まとめ

時々必要な作業をJpegoptimのようにさくっとコマンドで処理できるのは便利です。一括処理も可能ですし、もちろんシェルスクリプトで使用することも可能です。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。