Python

JPEGの中身を解析・解説〜入門編〜

この記事ではJPEGファイルの解析の方法を解説していきます。

今回使用する画像はこちらです。

(42 × 28の画像を拡大したものです。)

画像ファイルのダウンロードはこちらから

JPEGファイルを16進数のデータファイルに変換する

こちらはすでに変換したものがありますので、こちらをご使用ください。

ちなみに中身はこういったものになります。

 

JPEGの構造

解析の前にJPEGの構造を知る必要があります。

JPEGはセグメントと呼ばれるブロックに分けられ、様々なデータが格納されています。

今回扱う画像はこのような構造をしています。

このブロックはセグメントというのですが、各セグメントの始まりにはタグと呼ばれる2バイトの数字が置かれます。

このタグを識別することでセグメントを認識することができます。

では、SOI・EOIと、今回使用する画像で使われている各セグメントの構造も一緒に解析していきましょう。

JPEG画像の解析

まず最初に「0xff0xd8」がありますが、これはSOIタグなので飛ばします。

解析の前に

ここからは本格的な解析っぽくなりますが、すべて手順通りにやれば簡単にできます。

最初はタグを見つけましょう。APP0の場合は「FFE0」です。「0x」という文字で区切られているので気をつけましょう。

あとは下に表がありますので、その表に書いてあるバイト数をみて区切っていきましょう。

ちなみに1バイトは「0x」1個分です。なのでタグは2バイトですね。ちなみに8ビットは1バイトですので、4ビットのデータの場合は「0x」のあとに書かれた数字の上の位と下の位で分けていきます。

APP0の解析

APP0は基本的な情報が記述されています。

画像の幅や高さなどの情報は重要ですので、どの画像にも基本的にはあるはずです。

 

DQTの解析

量子化テーブルと呼ばれる領域です。

ここには8×8のテーブルが記述されており、このテーブルは圧縮されたデータをもとに戻すためのデータが存在しています。

 

SOFの解析

このセグメントには画像のサイズは色成分などの情報が入っています。

 

DHTの解析

ハフマンテーブルと呼ばれるセグメントです。

このハフマンテーブルはハフマン符号化の際に必要な符号の情報が記述されています。

 

SOSの解析

このセグメントは、後に圧縮された画像データが存在することを意味します。

 

各セグメントの構造

SOI・EOI (FFD8・FFD9)

SOI(Start Of Image)はイメージ(画像)の開始を示すタグで、EOI(End Of Image)はイメージ(画像)の終了を示すタグです。

APP0 (FFE0)

DQT (FFDB)

DHT (FFC4)

SOF (FFC0)

SOS (FFDA)

ABOUT ME
IT系だんし
プログラミングが大好きな人。 趣味でゲームやツール製作をしながら、プログラミング記事を書き続けています。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です