|
■No76222 (魔界の仮面弁士) > Jpeg なら、先頭 3 バイトが FF,D8,FF
■No76223 (774RR さん) > JPEG ならファイルの6バイト目から JFIF とか
JPEG 判定の説明が 2 通り提示されたので、一応追加説明。
---
JPEG は、「マーカー2バイト|セグメントサイズ2バイト|セグメントデータ…」形式の セグメントの繰り返しで構成されています。セグメントにはいろいろな種類がありますが、 先頭 2 バイトのマーカーで識別されます。各マーカーの 1 バイト目は、0xFF 固定です。
一般的な JFIF フォーマットの場合は、こんな感じで並びます。 デジカメ等で使われる EXIF も、JFIF の派生バージョンなので基本的には同様。
FF,D8 : <Start Of Image> ファイルの先頭は必ずコレ FF,E0 : <APP0 マーカー> 解像度情報など 2番目はこれ xx,xx : このセグメントのデータ長 4A,46,49,46,00 : 文字列 "JFIF\0" xx,xx : JFIFバージョン番号(1.01 なら 0x0101、1.02 なら 0x0102) xx : 解像度の単位(0=なし、1=ピクセル/インチ、2=ピクセル/センチメートル) xx,xx : 水平解像度 xx,xx : 垂直解像度 xx : サムネイルの幅(サムネイルが無ければ0) xx : サムネイルの高さ(サムネイルが無ければ0) 可変長 : サムネイルイメージデータ(24bitRGB) FF,DB : <量子化テーブル> xx,xx : このセグメントのデータ長 xx,xx : 量子化因子の精度(0=8bit、1=16bit) xx,xx : テーブル識別子(0〜3) 可変長 : 量子化因子(QF00〜QF77)
先頭には Start Of Image セグメントがあり、次に APP0 セグメントが続きますが、 以降のセグメントの順番は決まっていません。 APP0(FF,E0) の次に 量子化テーブル(FF,DB) が来る場合もあれば、デジカメ画像などの Exif 情報を持った APP1 セグメント(FF,E1) が続く場合もあります。
でもって、APP0 マーカー内にある ゼロ終端文字列「JFIF」を読み取るのが、 > JPEG ならファイルの6バイト目から JFIF とか という判定方法というわけですね。
一方で、APP0 セグメントを後ろに配置しても読めてしまう処理系もあります。 そのようなものにも対応させる場合には、処理を端折って、 先頭 2 バイトの <Start Of Image> および 後続セグメントのマーカーフラグ(FF) を > Jpeg なら、先頭 3 バイトが FF,D8,FF と読み取って判定することもできます。
ちなみに、JPEG 2000 の場合は、「先頭3バイトが FF,4F,FF」として判断できます。
JPEG 2000 の場合は、ファイル先頭が SOI(FF,D8)ではなく、 FF,4F : <Start Of CodeStream> で始まります。この後に続くセグメントは、やはり画像によってまちまちです。 イメージ&タイルサイズ(FF,51)となることもあれば、 タイルパート (FF,90)が来ることもあります。
|