1

私はまだあまり快適ではない低レベルでアプリケーションのスキャンに取り組んでいます:)

とにかく、私は私が得ている数から意味を理解しようとしています。

どうぞ:

  1. 200 DPI、白黒のスキャンレターサイズのドキュメント
  2. 解像度は最大1700x2200です
  3. 1700x2200=3740000ビットまたは467500バイトを計算します
  4. BITMAPINFOHEADERを取得すると、biSizeImage = 475200と表示されます。なぜですか?
  5. BITMAPでバイト配列を返すために使用するコードスニペットは、48バイト多い475248バイトを返します。しかし、biSizeは40と言っているので、ヘッダーが40の場合、画像データの前に48バイトあるのはなぜですか?

基本的に、BITMAPHEADERにある計算された467500と475200の違いがなぜなのかわかりません。

また、ヘッダーが40バイトと表示されている理由もわかりませんが、実際には48バイトですか?色情報は8バイトだと思いますか?画像は2色(白黒)なので、各色に4バイトを使用しますか?

編集

ここに情報があります:

ここに画像の説明を入力してください

わかったと思います。スキャンされたラインがメモリに保存されるとき、それは4バイトのパックでなければなりません。したがって、私の計算によれば、1700ビットは212.5バイトであり、私が見たものによれば、216バイトを使用します。だから、それは一種の理にかなっています。

4

1 に答える 1

2

BITMAPINFOHEADER実際のサイズは40バイトです。ビットマップは、構造体自体 BITMAPINFOではなく、構造体によって表されることに注意してください。構造体の直後にオプションのカラーパレットが含まれています。BITMAPINFOHEADERBITMAPINFORGBQUADBITMAPINFOHEADER

1700x2200は3740000ピクセルになり、ビットマップが1ビットピクセルを使用しているため、つまりモノクロのビットマップであるため、467500バイトを使用します。ビットマップには、ヘッダーとピクセルデータの間に余分な8バイトがあり、カラーパレットには2つの値が含まれるため、モノクロのビットマップと一致しRGBQUADます。BITMAPINFOHEADER::biBitCountピクセルごとに実際に使用されるビット数とカラーパレットの使用方法がわかるため、フィールドを考慮する必要があります。

DWORD追加のバイトは、境界に揃えるために最後にパディングされる各スキャンラインによって占められます。biSizeImageこの状況では、次のように計算されます。

biWidth = 1700
biCount = 1
biHeight = 2200
biSizeImage = ((((((biWidth * biCount) + 31) / 32) * 32) / 8) * biHeight) = 475200
于 2012-11-09T00:06:26.957 に答える