2021年10月2日土曜日

Exif の JPEGInterchangeFormat タグの謎

Exif に JPEG のサムネイルデータを付加した際に、その JPEG データの位置を JPEGInterchangeFormat タグで表しますが、規格書に疑問点があります。

Exif の規格書「デジタルスチルカメラ用画像ファイルフォーマット規格 Exif 2.32」 (CIPA DC-008-2019) には、JPEGInterchangeFormat タグについて以下の説明があります。

■ JPEG の SOI へのオフセット JPEGInterchangeFormat
JPEG 圧縮サムネイルデータの先頭バイト(SOI)へのバイトオフセット。サムネイルが JPEG 圧縮の場合にのみ用いる。主画像の JPEG データには記録してはならない。

これを見ると、JPEGInterchangeFormat は JPEG データのバイト位置を格納すればいいように見えます。
しかし、同規格の「附属書 A 画像ファイル記載例」の「A.3 JPEG 圧縮(4:2:2)ファイル」に掲載されている例ではこの説明と異なっています。

以下の表は掲載されている例のサムネイルの部分を抜き出したものです。
(Offset 以外の数値はリトルエンディアン)

1st IFDOffset
(Hex)
NameEntry Number
(Hex)
02C4Number Of Entries0700
Offset
(Hex)
NameTag ID
(Hex)
Type
(Hex)
Count
(Hex)
ValueOffset
(Hex or "ASCII")
02C6Compression030103000100000001000000
02D2XResolution1A010500010000001E030000
02DEYResolution1B0105000100000026030000
02EAResolutionUnit280103000100000002000000
02F6JPEGInterchangeFormat01020400010000002D0E0000
0302JPEGInterchangeFormatLength0202040001000000FF0A0000
030EYCbCrPositioning130203000100000002000000
Offset
(Hex)
NameOffset
(Hex)
031ANext IFD Offset00000000
Value longer than 4Byte of 1st IFDOffset
(Hex)
Data
(Hex or "ASCII")
Name
031E4800000001000000XResolution Value
03264800000001000000YResolution Value
Thumbnail Image DataOffset
(Hex)
NameData
032EThumbnail Data(JPEG Stream)

これを見ると、サムネイルデータの開始位置は 032E ですが、JPEGInterchangeFormat の ValueOffset はなぜか 2D0E0000 になっています。
サムネイルデータの先頭バイトへのバイトオフセットというのであれば、2E030000 となるように思うのですが。

この 2D0E0000 というのは、どうも 「032E (サムネイルのデータ位置) + 0AFF (JPEGInterchangeFormatLength) = 0E2D」となっているようです。
ということは、この例では JPEGInterchangeFormat は JPEG データの最後 (EOI) の次の位置を表しているようですが、なぜそうなっているのかが不明です。
私が何か勘違いをしているのでしょうか。

0 件のコメント:

コメントを投稿