質問

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

による BMPファイル形式のウィキペディアエントリ, 、ヘッダーの長さは14バイトで、以下を含める必要があります。

オフセットデータ
0x0000    "BM", for our intents and purposes
0x0002    Size of the bitmap file in bytes
0x0006    Dependant on the application creating the file
0x0008    Dependant on the application creating the file
0x000A    Offset of the image data/pixel array

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

私は数回記事を読みましたが、私の頭が少し痛いことを認めなければなりません。これは、このようなことをする最初の経験です。誰かが私がピクセルアレイの場所を取得する方法を解決するのを手伝ってくれますか?

役に立ちましたか?

解決

0x00060x0008 予約されているので、ゼロをそこに置くだけです。について 0x000A, 、それが実際の画像データがファイルで始まる位置です。通常、ここにあるヘッダーの後にDIBヘッダーが続きます(オフセットから始まります 0x000E)そして、DIBヘッダーの最初の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のfavicon 例として、オフセットの間にファイルの一部を取得します 0x00160x013E そして、それを処理します 42 4D 36 01 00 00 00 00 00 00 36 00 00 00. 。これにより、ある種の正しいビットマップファイルが得られます - そして、Irfanviewはそれを表示します。ただし、ICOファイルとBMPファイルに保存されているデータは、ICOファイルが透明性情報を保存する必要があるため、まったく同じではありません。このファビコンは、予想される16x16ではなく、DIBヘッダーに応じてサイズ16x32を持っている理由です。

から ウィキペディア:

32ビット未満の画像は、特定の形式に従います。画像は、カラーマスク(「XORマスク」)と不透明なマスク(「マスク」)で構成される単一の画像としてエンコードされます。 XORマスクは、ビットマップデータ内のマスクの前に先行する必要があります。画像がボトムアップ順に保存されている場合(これはおそらくそうである可能性が高い)、XORマスクはアンドマスクの下に描画されます。

私たちの特定のケースでは、これは256バイトの画像データから最初の64バイトがXORマスクであり、最後の64バイトとマスク、中央部のみが画像であることを意味します。私たちの特定のケースでは、画像データの開始を変更できます(オフセット 0x000A)0x76にXORマスクをスキップします。その後、DIBヘッダーの画像の高さも変更します(オフセット 0x0016)0x10に、マスクが無視されていることを確認します。ここで、これらの操作は、あなたが期待したものとほぼ同じように、有効なビットマップを提供します。一般的に、マスクを無視するよりもマスクを考慮する方が良いかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top