2

OpenSearch ドキュメントで指定されたサイトからプログラムでアイコンをダウンロードする作業を行っています。ICO 形式の場合は、(今のところ) 最初の画像を抽出する必要があります。ICO ファイルのヘッダーを問題なく読み取ることができ、最初の画像ファイルを切り取ることができました。ただし、ファイル形式を説明するウィキペディアのエントリを読んだ後、画像がビットマップ形式の場合、ファイルが不完全であることがわかりました (ヘッダーがありません)。そのため、データをファイルに保存する前にこのヘッダーを再構築する必要がありますが、少し苦労しています。

BMP ファイル形式のウィキペディアのエントリによると、ヘッダーの長さは 14 バイトで、次のものが含まれている必要があります。

オフセット データ
0x0000    「BM」、私たちの意図と目的
0x0002    のため ビットマップ ファイルのサイズ (バイト単位
) ファイル0x0006    を作成するアプリケーションに
0x0008    依存 ファイルを作成するアプリケーションに依存
0x000A    画像データ/ピクセル配列のオフセット

ビットマップ ファイルのサイズ (バイト単位) は、抽出された画像のサイズ + ヘッダーの 14 バイトになると考えましたが、0x0006、0x0008 に何を書き込むべきか、ピクセル配列の場所を取得する方法がわかりません。 0x000A に書き込みます。

記事を何度か読みましたが、頭が少し痛いことを認めなければなりません。このようなことをするのは初めての経験です。ピクセル配列の場所を取得する方法を教えてくれる人はいますか?

4

1 に答える 1

5

0x00060x0008予約されているので、単にゼロをそこに置く必要があります。に関しては0x000A、それが実際の画像データがファイル内で開始する位置です。通常、ここにあるヘッダーの後に(offsetで始まる)DIBヘッダーが続き、DIBヘッダー0x000Eの最初の4バイトがそのサイズになります。したがって、DIBヘッダーのサイズを取得し、その開始オフセット(0x000E)を追加すると、実際のデータが開始する位置が得られます。これを位置に配置し0x000Aます。

ランダムビットマップファイルのデータ例を次に示します。

42 4D             "BM"
2E 78 08 00       Size of the entire bitmap file (0x8782E meaning 555054 bytes)
00 00             creator1, reserved
00 00             creator2, reserved
36 00 00 00       Image data starts at offset 0x36 because the next 0x28 bytes are DIB header
28 00 00 00       DIB header started and its size is 0x28 (40 bytes)
another 36 bytes
FF FF FF          First pixel of the image (white as it happens)

serverfault.comのファビコンを例に取ると、offset0x0016との間のファイルの一部を取り、その0x013E前に。を付けることになります42 4D 36 01 00 00 00 00 00 00 36 00 00 00。これにより、ある種の正しいビットマップファイルが得られます。IrfanViewはそれを表示します。ただし、ICOファイルは透明度情報を保存する必要があるため、ICOファイルとBMPファイルに保存されるデータはまったく同じではありません。そのため、このファビコンのサイズは、予想される16x16ではなく、DIBヘッダーに応じて16x32になります。

ウィキペディアから:

色深度が32ビット未満の画像は、特定の形式に従います。画像は、カラーマスク(「XORマスク」)と不透明度マスク(「ANDマスク」)で構成される単一の画像としてエンコードされます。XORマスクは、ビットマップデータ内のANDマスクの前に置く必要があります。画像がボトムアップの順序で保存されている場合(ほとんどの場合)、XORマスクはANDマスクの下に描画されます。

私たちの特定のケースでは、これは256バイトの画像データから最初の64バイトがXORマスクであり、最後の64バイトがANDマスクであり、中央部分のみが画像であることを意味します。この特定のケースでは、画像データの開始(オフセット0x000A)を0x76に変更して、XORマスクをスキップできます。次に、DIBヘッダー(オフセット0x0016)の画像の高さを0x10に変更して、ANDマスクが無視されるようにします。ここで、これらの操作により、期待どおりの有効なビットマップが得られます。ただし、一般的には、マスクを無視するよりも、マスクを検討する方がよい場合があります。

于 2011-09-09T12:08:48.543 に答える