| 
                ■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)が来ることもあります。
  |