新しい画像ファイルBPGを使う

"BPG Image format"という新しい画像ファイルフォーマットが出てきている。
まだViewerがなくて、デフォルトで見るにはJavaScriptを使わないと見えないけど、圧縮率も高いようなので使ってみた。
それとマジックバイトも気になったので見てみた。

BPGのサイトはこちら

特徴はざっとこんな感じ

  • 高い圧縮率。JPEGよりも遥かに小いサイズだが同程度の品質
  • JavaScriptデコーダさえあれば、ほとんどのブラウザでサポート
  • JPEGと同じchroma format(彩度とか輝度とか)。これにより、変換による劣化を低減
  • 圧縮時のロスがない(可逆ってことですかね)
  • EXIF, ICC profile, XMPとかのメタデータも含められる

なお、今回はWindows環境にて試している。
特にレジストリ書き換え等もないため、ファイルを配置するだけで利用可能である。

BPGファイルの生成

まずはBPGファイルを利用するために、ページからBPGのエンコーダをダウンロードする。
f:id:f_rin:20141219011617p:plain

zipを解凍して、そのフォルダにjpgとかpngファイルをコピーする(今回は "in.jpg" )。
f:id:f_rin:20141219012247p:plain
あとは元の画像ファイルを引数としてエンコーダを叩いてあげるだけ。
CMDでやるならば、以下の1行で良い。カレントディレクトリにファイル"out.bpg"が出力される。

C:\Users\rintaro\bpg-0.9.3-win32>.\bpgenc.exe in.jpg

もしくは、元の画像ファイルを"bpgenc.exe"までドラッグ&ドロップしてあげればいい。
元の画像ファイルと同じフォルダに"out.bpg"が出力される。
f:id:f_rin:20141219012924p:plain

※ちなみに、jpgとpngは変換できたが、bmpgifはできなかった。

C:\Users\rintaro\bpg-0.9.3-win32>bpgenc.exe in.gif
Not a JPEG file: starts with 0x47 0x49
C:\Users\rintaro\bpg-0.9.3-win32>bpgenc.exe in.bmp
Not a JPEG file: starts with 0x42 0x4d

BPGファイルの閲覧

先にも書いたが、WindowsにはまだViewerがないようで、JSにより復元する。
解凍したフォルダの中に、htmlというフォルダが入っている。
サンプルを見ると、その中の"bpgdec8b.js"を利用すると閲覧できるようだ。
同じフォルダに、生成したBPGファイルを入れ、以下のHTMLを書く。

<html>
  <head>
    <meta charset="UTF-8"> 
    <script type="text/javascript" src="bpgdec8b.js"></script>
  </head>
  <body>
    This is a bpg.<br />
    <img src="out.bpg">
  </body>
</html>

BPGファイルの指定は、jpgなどと同様にimgタグで指定すればよい。
あとはこのHTMLファイルを開くだけ。
f:id:f_rin:20141219013932p:plain

ちなみにサイズを見てみると半分以下。なかなか賢い。
f:id:f_rin:20141219020307p:plain

ちゃんとJPGとの比較・評価はしてないけど、見た目変なところはないし、サイズも小さい。閲覧さえ簡単になればいいと思った。
jpgとの比較結果を見たければ以下サイトとかを見るといいと思う。

JPEG画像の約半分のファイルサイズで同品質のものを表示できる画像形式「BPG」が誕生、実際に使ってみるとこんな感じ - GIGAZINE

BPGファイルのマジックナンバー

このBPGファイルに対してfileコマンドを打ってみる。
もちろん結果は、

[rintaro@rintaro_PC] $ file out.bpg
out.bpg: data

見事にdataとなっている。
ただ、hexを見てみると、先頭6バイトがは固定されている。

[rintaro@rintaro_PC] $ xxd out.bpg|head
0000000: 4250 47fb 2000 8161 8161 8656 0392 4740  BPG. ..a.a.V..G@
0000010: 4401 c190 9581 1200 0001 2601 af26 e7ab  D.........&..&..
0000020: 7ff8 8039 a57d b4fe d6b5 3465 fcad 2004  ...9.}....4e.. .
0000030: 731f 8c55 04c3 539d 401b 8be7 9035 3cc4  s..U..S.@....5<.
0000040: 9949 138c e9dd 923c 82b5 29be 6d1d 6206  .I.....<..).m.b.
0000050: 3a0d fdf3 644f 1eae b436 4dab e746 390c  :...dO...6M..F9.
0000060: 62e5 009d 4eaa 56de 1aaf d933 af4a 9abe  b...N.V....3.J..
0000070: 4aac 27d1 2308 ec00 de20 0b6c 20a6 ac1e  J.'.#.... .l ...
0000080: 7c8a 7cc1 392d 0811 b24f 9bd4 4d9b 5662  |.|.9-...O..M.Vb
0000090: 561f 802f 29a1 af56 d343 9860 ab7c 17cf  V../)..V.C.`.|..

ASCIIだと先頭3文字が "BPG"から始まる。hexだと "4250 47fb 2000" となっているのがBPGファイルだ。
もしCTFとかでなんかわからんファイルが出てきて、先頭が"BPG"となっていれば、画像ファイルとして復元できるだろう。
というか、そのうちfileコマンドが対応するよね。メジャーになればだけど。

それまでは、目grepでがんばることにする。