====== MozJPEGのjpegtranによるJPEG圧縮最適化が凄い件 ======
とても今更なんですけどね、Mozilla謹製JPEGライブラリ群の一部、jpegtranによるJPEG最適化の効果に驚愕しとるわけです。
PENTAX K-1を買ってからというものPCのストレージの減り方が半端なく、そりゃJPEG+RAWで撮ってれば1シャッターにつき60MB前後の容量を食うので当たり前なわけでありますが、冗談抜きで空き容量が逼迫しとるんですわ。1TBのSSDうち820GBをデータ用に割り当ててるのに、現時点で残り2.3GBですよ。使用量のうち8割が写真であるからして、白羽の矢が立ったのがMozJPEGというわけ。(RAWが一番容量食ってるってツッコミはなしなんだぜ。)
とりあえず急場凌ぎで、画像の品質には一切影響を与えないjpegtranで最適化してみたら、縮むこと縮むこと。元の画像サイズが大きいことも相まって、1枚あたり1MB弱ほど小さくなった。論より証拠ってなもんでスクショをご覧頂こう。
{{ :blog:2017:jpegtran_size_comparision.png | jpegtranによるファイル容量削減結果 }}
圧縮データの最適化、つまり無劣化でここまで縮むんだから大したもんですよ。もっとも、演算能力や処理時間の制約が厳しいデジカメで生成されたJPEGデータなので、最適化の余地が大きかろう点は考慮の必要があるだろうが…。
画像右端の「算術符号」ってのは、-arithmeticオプションで最適化した結果である。ハフマン符号最適化(-optimizeオプション)より更に小さくなっており、その効果には目を見張るばかりだが、哀しい哉、特許の関係で算術符号でエンコードされたJPEGに対応したソフトは皆無…。試した範囲では、MacOS X v10.9のプレビュー.app、Photoshop CC 2015.5、Firefox 58のいずれにおいても表示する事ができなかった。フォトショとLightroomで使えれば、手元のデジタル写真ライブラリの容量削減に大きく寄与するんだがなー。口惜しい…。
ついでに言うと、-optimizeより-arithmeticの方が処理時間が短かったりするのよね。軽くて縮むとかどんだけだよ。本当に口惜しい……。MacBook Pro (Late 2013)での処理時間は↓こんな感じ。
・-optimizeの時
real 3m35.907s
user 3m22.685s
sys 0m11.282s
・-arithmeticの時
real 3m12.291s
user 2m57.712s
sys 0m11.897s
-copy allオプションを付ければJPEGに含まれるメタデータは全て引き継がれる。少なくともexiftoolで比較した限りでは、元ファイルと最適化後のファイルでExifの相違はなかった。
個人的には元ファイルのタイムスタンプも継承したかったので、下記のようなシェルスクリプトで処理した。
#!/bin/sh
TARGETDIR="$1"
OUTDIR="$1/out"
FILES=`find "$TARGETDIR" -maxdepth 1 -type f -name '*.JPG'`
echo `pwd`
mkdir -p $OUTDIR
for file in $FILES; do
echo $file
CTIME=`GetFileInfo -d "$file"`
MTIME=`GetFileInfo -m "$file"`
OUTFILE="$OUTDIR/$file"
jpegtran -optimize -progressive -copy all "$file" > "$OUTFILE"
#jpegtran -arithmetic -progressive -arithmetic -copy all "$file" > "$OUTFILE"
SetFile -d "$CTIME" "$OUTFILE"
SetFile -m "$MTIME" "$OUTFILE"
done
ご覧の通り、エラー処理とか何も入れてないので、元ファイルが無関係のファイルが無くなってもしらにゃい(´・ω・`)。GetFileInfoとSetFileを使ってるのでXcodeを入れとく必要がある、つまりこのスクリプトはMac専用なんだぜ。