JPEG ハフマン分割

にて話題になった、Apple RetinaJPEG 画像。

とりあえず、JPEG chunk を見てみると、

yoya@sakura:~$ jpeg_segment unlock_001.jpg  | grep DHT | wc
     11      33     360

(https://twitter.com/yoya/status/250783995107872769)

効果の程

ハフマンブロック分割で、どの位の効果が出てるのか。

yoya@sakura:~$ convert  unlock_001.jpg test.jpg 
yoya@sakura:~$ convert test.jpg test2.jpg
yoya@sakura:~$ ls -l unlock_001.jpg  test.jpg  test2.jpg 
-rw-r--r-- 1 yoya develop 942006 2012-10-30 17:57 test.jpg
-rw-r--r-- 1 yoya develop 942236 2012-10-30 17:57 test2.jpg
-rw-r--r-- 1 yoya develop 850671 2012-09-19 21:20 unlock_001.jpg

分割しない場合に比べて、1割弱減っていると推測出来る。

チャンク

yoya@sakura:~$ jpeg_segment unlock_001.jpg 
(0) marker=SOI(FFD8): length=0
(1) marker=APP0(FFE0): length=14
(2) marker=DQT(FFDB): length=65
(3) marker=DQT(FFDB): length=65
(4) marker=SOF2(FFC2): length=15
(5) marker=DHT(FFC4): length=27
(6) marker=SOS(FFDA): length=37956
(7) marker=DHT(FFC4): length=27
(8) marker=SOS(FFDA): length=25509
(9) marker=DHT(FFC4): length=26
(10) marker=SOS(FFDA): length=25397
(11) marker=DHT(FFC4): length=60
(12) marker=SOS(FFDA): length=123686
(13) marker=DHT(FFC4): length=80
(14) marker=SOS(FFDA): length=128703
(15) marker=DHT(FFC4): length=40
(16) marker=SOS(FFDA): length=139193
(17) marker=DHT(FFC4): length=39
(18) marker=SOS(FFDA): length=191382
(19) marker=DHT(FFC4): length=38
(20) marker=SOS(FFDA): length=33315
(21) marker=DHT(FFC4): length=77
(22) marker=SOS(FFDA): length=58239
(23) marker=DHT(FFC4): length=38
(24) marker=SOS(FFDA): length=33123
(25) marker=DHT(FFC4): length=71
(26) marker=SOS(FFDA): length=53400
(27) marker=EOI(FFD9): length=0
  • APP1, APP2 等のメタ情報が無いので制作したソフトウエアのヒントが無い
  • DHT で区切られた SOS の長さがてんでバラバラなので、単純に等間隔に分割させたとは考え難い。(勿論、圧縮の結果違うというのもありうるけど)
    • 一度、ハフマン符号だけ解いて、本当の分割長を調べる必要がある

妄想

統計とか疎いのでいっその事、scanline 毎に、符号頻度ヒストグラムの256次元ユークリッド距離の変化を調べて、その頂点を区切りに分割するのはどうだろう。

追記

実は分割されてたのはプログレッシブJPEGだからで、通常の JPEG だと分解できないようです。