mozjpeg(cjpeg, jpegtran)をWindowsで使って画像を最適化する

2017年3月13日ブログ運営

Google PageSpeed Insightsに「画像を最適化する」と表示されてしまいましたので、修正方法を調べてみました。

画像の品質に影響を与えずに JPEG や PNG ファイルに対して高度なロスレス圧縮を実行するツールがいくつか提供されています。JPEG では、jpegtran またはjpegoptim(Linux のみ。–strip-all オプションを指定して実行します)をおすすめします。PNG では OptiPNG または PNGOUT をおすすめします。

https://developers.google.com/speed/docs/insights/OptimizeImages

上記の通り、Googleさんオススメのjpeg最適化のツールは「jpegtran」か「jpegoptim」だそうです。コレを使って最適化してくださいということみたいです。Windowsユーザーならjpegtranになりそうですね。

mozjpeg(jpegtran / cjpeg)の配布サイト

今、mozjpegが熱いらしいので、mozjpegの使い方を調べてみました。

なんとバイナリを配布している神がいました。

ここからバイナリ(exeファイル)を落として、cmdから実行すればオッケー。

.debでも配布されているのでUbuntu on Windows 10にも入れられそうですね。

 

自分でmakeしたいという奇特な変態さんは以下からソースコードを入手してください。

GitHub – mozilla/mozjpeg: Improved JPEG encoder.

mozjpegを使う

mozjpeg/usage.txt at master · mozilla/mozjpeg · GitHub

ここにmozjpegの使い方が書かれていました。サラッと読んでみたところ、使う可能性のありそうなコマンドは以下3つでした。

cjpeg
非可逆圧縮。jpegファイルの容量を小さくしたり、他のファイル(bmp等)をjpegに変換する
jpegtran
可逆圧縮
djpeg
展開。jpegファイルをbmpにしたりgifにしたりする

基本的に、mozjpegを使おうと思ってる方って

  • 画像のデータサイズを落とす
  • エントロピー符号の最適化を行うこと

が目的でしょうから、この目的でいえば基本的にはcjpegを使い、画質に強くこだわりのある場合はjpegtranを使うということになるでしょう。

ちなみに

  • cjpegのcはcompressのc
  • djpegのdはdecompressのd。
  • jpegtranのtranはtransformのtran

のようですね。

cjpegの使い方

cjpeg [switches] -outfile output_jpgfile input_imgfile

で使います。他にもやり方はありますが、上記のやり方だと統一感があります。

例えば、

cjpeg -outfile output.jpg input.jpg

とすればinput.jpgを処理して(画質を落として)output.jpgとして出力します。

cjpeg -outfile output.jpg input.bmp

とすれば、bmpをjpgに変えることができます。

cjpegの気になったオプション(switches)

コマンドにオプションを与えることができます。一例を上げると

cjpeg -quality 80 -outfile output.jpg input.jpg

のような形で、qualityオプションを指定し、-qualityの後ろの数値をいじることで、画質を調整できるようになるそうです。

-quality N

画質を調整するオプション。後ろの数値(N)は0(画質悪)~100(画質良)の整数で指定。

Normally you want to use the lowest quality setting (smallest file) that decompresses into something visually indistinguishable from the original image. For this purpose the quality setting should generally be between 50 and 95 (the default is 75) for photographic images. If you see defects at -quality 75, then go up 5 or 10 counts at a time until you are happy with the output image. (The optimal setting will vary from one image to another.)

と書かれておりますので、大抵の場合、50~95の値で設定するのが良いそうです。

デフォルト(=引数なし)は-quality 75で設定されており、これに満足できなければ、値を5や10単位で変えてみてくださいって書いてます。

-optimize

エントロピー符号の最適化を行う為にはこのオプションをつければいいらしい。

-progressive

これを付けるとプログレッシブJPEGを作成できるらしい。

プログレッシブにすべきか否かは微妙なところがあるので各自判断が必要な部分ですね。

At present, -optimize mode is always selected when generating progressive JPEG files.

と記載されていましたので、-progressiveを指定すると自動的に-optimizeも指定していることになるらしい。

-restart 1

The -restart option inserts extra markers that allow a JPEG decoder to resynchronize after a transmission error. Without restart markers, any damage to a compressed file will usually ruin the image from the point of the error to the end of the image; with restart markers, the damage is usually confined
to the portion of the image up to the next restart marker. Of course, the restart markers occupy extra space. We recommend -restart 1 for images that
will be transmitted across unreliable networks such as Usenet.

リスタートマーカーというものを画像データにつけることで、伝送エラーが起きた時でも、途中から画像を再取得(リスタート)できるようになるらしいです。

当然、その分ファイルサイズは増えるけど、貧弱なネットワークでの使用を想定している時は、-restart 1をつけると良いみたい。

デフォルトは-restart 0(リスタートマーカーをつけない)。

基本的には不要なはずですけど、面白い仕組みなので頭の片隅にでも置いておいてもいいかも。

カラーGIFはjpegにしない方が良いよ

Color GIF files are not the ideal input for JPEG; JPEG is really intended for compressing full-color (24-bit) images. In particular, don’t try to convert cartoons, line drawings, and other images that have only a few distinct colors. GIF works great on these, JPEG does not. If you want to convert a GIF to JPEG, you should experiment with cjpeg’s -quality and -smooth options
to get a satisfactory conversion. -smooth 10 or so is often helpful.

カラーgifはjpgにしない方が良い(特に漫画や線画など)的な雰囲気を醸し出している書き方がされていました。

それでもしたいなら、-qualityオプションや-smoothオプションをつけて実験した方がよいとのこと(-smooth 10とかそこらへんの値が役立つことが多いんじゃないかって書いてある)

JPEGは基本的に写真データとかに使いますから当然といえば当然ですね。

jpegtranの使い方

jpegtranを使用すればロスレスで画像を加工できます。画像の回転とか。

しかし、こういった画像加工は専用のGUIソフト(例えばGimpとか)で行う方が大半だと思います。

とすれば、実際の所、jpegtranは以下のような使い方になるしょう。

jpegtran -copy none -optimize -outfile outputfile.jpg inputfile.jpg
-optimize
ハフマン符号最適化を行う
-copy none
メタ情報を削除する(ExIf情報など)

コレで、可逆圧縮で、最適化とメタ情報の削除を行うことができます。

mozjpegの使い方まとめ(自分用)

非可逆圧縮でファイルサイズを落としたい時

cjpeg -quality 75 -optimize -outfile output.jpg input.jpg

このように圧縮。画質をいじりたい人は75の数値を50(画質悪)~95(画質良)でいじる。デフォルトの値は75なので、75くらいを指定しておけば大概のケースでそれなりの結果を吐き出すことでしょう。

更に、プログレッシブjpegにしたい人は-progressiveをつける。

可逆圧縮でファイルサイズを落としたいとき

jpegtran -copy none -optimize -outfile outputfile.jpg inputfile.jpg

です。-copy noneによってメタ情報を削除できる。

EWWW Image Optimizerでjpegtran使ってるんだけどな…

よし!使い方がわかったので画像を最適化しよう!

と意気込んだのですが、私、そういえばWordpressにEWWW Image Optimizerというプラグインを導入していることを思い出しました。

Ensure jpegtran, optipng, pngout and gifsicle are installed on your Linux server (basic installation instructions are below if they are not). You will receive a warning when you activate the plugin if they are not present. This message will go away once you have them installed.

EWWW Image Optimizer — WordPress Plugins

と記載されているので、EWWW Image Optimizerで既にjpegtranを使用したjpegの最適化を行っていることが判明しました…

あれ、Google PageSpeed Insightsで画像最適化って出てたけど…(;´∀`)

よくわかりませんが、既に最適化済っぽいので、よしとしますん(;´∀`)