1

我正在扫描应用程序的低级别,我已经不是很舒服了:)

无论如何,我试图从我得到的数字中弄清楚。

开始了:

  1. 以 200 DPI、黑白扫描 Letter 尺寸的文档
  2. 分辨率高达 1700x2200
  3. 我计算 1700x2200 = 3740000 位或 467500 字节
  4. 当我得到 BITMAPINFOHEADER 时,它显示 biSizeImage = 475200。为什么?
  5. 我使用 BITMAP 返回字节数组的代码片段返回 475248 字节,多出 48 个字节。但是 biSize 说的是 40,所以如果 header 是 40,那么为什么图像数据前面有 48 个字节呢?

基本上,我不明白为什么在 BITMAPHEADER 中计算的 467500 和 475200 之间存在差异?

我也不明白为什么标题说它是 40 字节,但实际上它是 48?我只是猜测颜色信息是 8 个字节?因为图像是 2 色 (B/W) - 每种颜色使用 4 个字节?

编辑

这是信息:

在此处输入图像描述

我明白了。当扫描线保存在内存中时,它必须是 4 个字节的包。所以,根据我的计算,1700 位是 212.5 字节,根据我所看到的 - 它使用 216 字节。所以,有点道理。

4

1 回答 1

2

BITMAPINFOHEADER真的是 40 字节大小。请记住,位图由BITMAPINFO结构表示,而不是BITMAPINFOHEADER结构本身。 在结构之后立即BITMAPINFO包含一个可选的RGBQUAD调色板。BITMAPINFOHEADER

1700x2200 将是 3740000 像素,这将占用 467500 字节,因为位图使用 1 位像素,即它是单色位图。您的位图在标题和像素数据之间有额外的 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 回答