JpegTables で共通化できるのか?

大量の JPEG データをファイルに含める際に、
圧縮用テーブルを共通で持てるとサイズが節減できる。

SWF ファイルがそれを意識した構造なので、
swfed のように SWF 内部の JPEG を入れ替えるツールで
利用できないか検証してみた。

検証概要:

世の中から無作為に JPEG ファイルを集め、それらの
圧縮用テーブルが何種類あるのか調べる。

圧縮テーブルセグメント:

まず、JPEG 中の圧縮テーブルセグメントだけ取り出すプログラムを作成。

% jpeg_jpegtable ~/love/aria.jpg tmp.jpg
% jpeg_segment tmp.jpg
(0) marker=SOI(FFD8): length=0
(1) marker=DQT(FFDB): length=65
(2) marker=DQT(FFDB): length=65
(3) marker=DHT(FFC4): length=29
(4) marker=DHT(FFC4): length=179
(5) marker=DHT(FFC4): length=29
(6) marker=DHT(FFC4): length=179
(7) marker=EOI(FFD9): length=0

15分ほど*1であっさり出来た。ノリで SOI, EOI つけてるのはご容赦を。

jpeg_segment はこれね↑

検証作業:

まず、大量に集めた JPEG ファイルから内容が同じのを取り除く作業から。
MD5 Digest が同じファイルは一つを残して削除しまくる。

そして、以下のように JpegTables を抽出しながら、
それらの MD5 Digest 値を記録。

for f in *.jpg; do
jpeg_jpegtable $f /dev/stdout | md5sum - >> digest.list
done;

さて、結果は。

% wc  digest.list
 1756  3512 63216 digest.list
& sort digest.list  | uniq  | wc
   1063    2126   38268

うーん。思ったよりバラバラすぎる… 微妙。
JPEG 画像生成時に仕掛けを入れるならまだしも、
既にある JPEG 画像を差し替える swfed ではダメという結論です。

*1:しかも、その殆どは PHP に慣れすぎてて変数の頭に無意識に $ をつけては消す作業に追われたという。。。