JpegTables で共通化できるのか?
大量の JPEG データをファイルに含める際に、
圧縮用テーブルを共通で持てるとサイズが節減できる。
SWF ファイルがそれを意識した構造なので、
swfed のように SWF 内部の JPEG を入れ替えるツールで
利用できないか検証してみた。
検証概要:
世の中から無作為に JPEG ファイルを集め、それらの
圧縮用テーブルが何種類あるのか調べる。
圧縮テーブルセグメント:
まず、JPEG 中の圧縮テーブルセグメントだけ取り出すプログラムを作成。
- http://diary.awm.jp/~yoya/data/2010/06/06/jpeg_jpegtable.c
- http://diary.awm.jp/~yoya/data/2010/06/06/bitstream.h
- http://diary.awm.jp/~yoya/data/2010/06/06/bitstream.c
% 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 ではダメという結論です。