【问题标题】:Making sense of plain bitmap structure BITMAPINFOHEADER理解普通位图结构 BITMAPINFOHEADER
【发布时间】:2012-11-08 23:43:52
【问题描述】:

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

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

我们开始吧:

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

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

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

编辑

这是信息:

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

【问题讨论】:

  • 将图像发布到文件共享服务,以便每个人都可以检查您的假设。

标签: .net winapi bitmap scanning twain


【解决方案1】:

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

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

【讨论】:

  • 是的,这部分很清楚。它是单色图像。但是为什么 biSizeImage 说 475200 而不是我们都计算的 467500 呢?如果我要计算像素行 - 它最多 212.5 字节,我得到的实际大小是 216 字节
  • 你能显示BITMAPINFOHEADER的所有其他值吗?
  • 是的,将每个扫描行的字节数四舍五入到下一个DWORD 边界是有意义的。很好,我忘记了。
猜你喜欢
  • 2012-09-08
  • 1970-01-01
  • 2018-08-14
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多