2

fuji 3D カメラなどのカメラで生成された MPO マルチピクチャ ファイルに含まれる情報を取得するために何かを書いています。

私は提案された仕様を持っていますが、これは明らかに混乱を招くように書かれており、ここから入手できます: CIPA multi picture spec PDFで、通常の exif パーツをナビゲートし、MFP 情報を抽出しました。

ヘッダーリストについて説明しているセクション 5.2.3 ヘッダーリスト:

4 byte endian flag
4 byte offset
-- start of MP Index --
2 byte count
12 byte version
12 byte number of images
12 byte MP entry
12 byte Individual unique ID list
12 byte total number of capture frames
4 byte offset to next IFD.

この図は、オフセット (12 バイトになる) を指す MP エントリと一意の ID リストを示しています。ただし、次の説明では、MP エントリはすべての画像に対して 16 バイトである必要があり (2 つの画像を含むサンプル画像ではそうです)、個々の一意の ID はすべての画像に対して 33 バイトであることが示されています (私のサンプルではそうではありません)。これはありません)。

画像の数まで、すべてが本来あるべき状態です。2 つの画像があり、バージョンは正しく、3 つのブロック (カウント) があるようです。ただし、3 番目のブロック (MP エントリ) には正しいコード、正しいバイト数、正しいタイプがありますが、次の情報が含まれています。

32 00 00 00  52 00 00 00  02 00 02 20  40 63  1B 00 
00 00 00 00  00 00 00 00  02 00 02 00  EE 6F  1B 00 

テキストは、これの内容は

offset   length   name
0x00     4        Individual Image attribute
0x04     4        individual Image Size
0x08     4        Individual image offset
0x10     2        dependant image 1 entry number
0x12     2        dependant image 2 entry number

明らかに、2 つの画像 (事実上 10MP jpeg) がある場合、それらのサイズが 52 バイトで 0 であることは意味がありません。

誰かがこれを見て、私の解釈に腹を立てていないことを確認できますか、それともここに何があるべきか知っている人はいますか?

申し訳ありませんが、少し複雑なのはわかっていますが、どこが間違っているのか本当にわかりません。

4

2 に答える 2

4

あなたのタグは大丈夫だと思います。

仕様の第 5.2 章 (MP 拡張機能) には、MP インデックス IFD が次のように記載されています。

  • カウント(2 バイト)
  • MP インデックス フィールド(全体構造情報)
  • 次の IFD のオフセット(4 バイト)
  • (MP インデックス IFD)

画像の数までは、仕様どおりです。MP Entry タグから始めて、バイトは次のように解析されます: (MPO ファイルから解析されたデータを使用します)

02 b0 07 00   20 00 00 00   32 00 00 00   52 00 00 00
02 00 02 20   00 13 18 00   00 00 00 00   00 00 00 00
  • 02-b0 - タグ ID (MP エントリ)、2 バイト
  • 07-00 - タイプ (7 = 未定義)、2 バイト
  • 20-00-00-00 - 32 (16 x NumberOfImages、ファイル内の 2 つの画像、この値は以前に解析されました)、4 バイト
  • 32-00-00-00 - 最初の IFD のオフセット (エンディアン タグから始まる 50 バイト)、4 バイト

ここで MP エントリ データが終了します。個別画像固有 ID リスト(b003) や総キャプチャ フレーム数(b004) タグがないのは奇妙で、必要ないのかもしれません。とにかく、次の 4 バイトは次の IFD のオフセットを示します。

  • 52-00-00-00 - 次の IFD のオフセット (エンディアンタグから始まる 82 バイト)、4 バイト

最初の IFD (私の場合) は、次の IFD のオフセットの直後に開始されます。

  • 02-00-02-20 - 個別の画像属性、4 バイト
  • 00-13-18-00 - 個々の画像サイズ (私の場合は 1 577 728 バイトのデータ)、4 バイト
  • 00-00-00-00 - 個々の画像データ オフセット (最初の画像の場合は 0 の状態)、4 バイト
  • 00-00 - 従属イメージ 1 (従属イメージなし)、2 バイト
  • 00-00 - 従属イメージ 2 (従属イメージなし)、2 バイト

あなたの場合、データは次のように解析する必要があります。

32 00 00 00  52 00 00 00  02 00 02 20  40 63  1B 00 
00 00 00 00  00 00 00 00  02 00 02 00  EE 6F  1B 00
  • 32-00-00-00 - 最初の IFD のオフセット (エンディアン タグから始まる 50 バイト)、4 バイト
  • 52-00-00-00 - 次の IFD のオフセット (エンディアンタグから始まる 82 バイト)、4 バイト
  • 02-00-02-20 - 個別の画像属性、4 バイト
  • 00-13-18-00 - 個々の画像サイズ (1 794 880 バイトのデータを表す)、4 バイト
  • 00-00-00-00 - 個々の画像データ オフセット (最初の画像の場合は 0 の状態)、4 バイト
  • 00-00 - 従属イメージ 1 (従属イメージなし)、2 バイト
  • 00-00 - 従属イメージ 2 (従属イメージなし)、2 バイト

そして、次の画像のデータを開始します:

  • 02-00-02-00 - 個別の画像属性、4 バイト
  • EE-6F-1B-00 - 個々の画像サイズ (1 798 126 バイトのデータを表す)、4 バイトなど。


画像サイズとオフセットについて

画像のサイズとオフセットは少し混乱する可能性があります。仕様は次のように述べています。

「画像サイズは SOI マーカーと EOI マーカーの間のデータです」(ch. 5.2.3.3.2)

「(2 番目のイメージの) データ オフセットは、MP ヘッダーの MP エンディアン フィールドのアドレスに対して相対的に指定されます」(ch. 5.2.3.3.3)

私は次のように理解しています:

SOI---MPF_FIELDS-------------EOI 
      ^
      MP endian field
      XXXXXXXXXXXXXXXXXXXXXXXXXXSOI--------------------------EOI

(最初の画像、たとえば、マーカーを含む SOI と EOI マーカーの間の 2164288 バイト。2 番目の画像、マーカーを含む SOI と EOI マーカーの間の 2221368 バイト。XXXXX はオフセットを示します)

lengthOf(XXXXX)2 番目のイメージのオフセットは、最初のイメージの MP フィールドにある MP エンディアン マーカーの後に SOI マーカーがバイト単位で開始されることを意味します。最初の画像サイズからオフセット値を差し引くと、MP エンディアン マーカーの位置が得られるはずです。

于 2010-12-14T08:52:04.987 に答える
1

リトルエンディアンを想定すると、ベースアドレスはAPP2ヘッダーの8バイト、「MPF\0」の直後、「II*\0」の直前であると思います。あなたが提供した 16 進ダンプには MPO タグは含まれていませんが、「32 00 00 00」は MPEntries のオフセットを指し、「52 00 00 00」は次の IFD へのオフセットであると思います。あなたが見たいのは「02 00 02 20」で、おそらく最初の画像の属性です。

オフセットが「00 00 00 00」の場合、それは相対ではなく絶対です。

于 2010-11-11T17:38:10.157 に答える