【问题标题】:Extract width of BMP image in c在c中提取BMP图像的宽度
【发布时间】:2018-11-27 05:54:39
【问题描述】:

我是一名初学者程序员,正在尝试学习 c 中的图像处理并找到了一些教程,但我被困在一条线上(负责提取 widthint width = *(int*)&header[18]; 我无法理解上述语法。 谁能简单解释一下?

【问题讨论】:

  • 该代码使用了一个魔术常数 18。在我看来,您最好找到并查看一个示例,该示例使用适当的结构来访问这样的结构化文件信息。

标签: c image-processing bmp


【解决方案1】:
int width = *(int*)&header[18];

假设header 的类型为char*char[],逐个片段:

header[18]

→ 获取header的第18个元素

&header[18]

→ 获取header的第18个元素的地址

(int*)&header[18]

→ 将header 的第18 个元素的地址转换为指向int 的指针

*(int*)&header[18]

→ 获取指向int 的指针的内容。


BMP 文件中的值存储在little-endian。因此,此代码仅适用于 little-endian 平台。更通用的代码如下所示:

int width
  = (unsigned)(unsigned char)header[18]
  | (unsigned)(unsigned char)header[19] << 8
  | (unsigned)(unsigned char)header[20] << 16
  | (unsigned)(unsigned char)header[21] << 24;

int width 现在由移动到相应位置的单个字节组成。这应该适用于所有字节序。

【讨论】:

  • Thnx :) 现在我能理解了
  • 我有一个疑问,你最后写了“获取内容”,那么为什么我们不能像`char var=header[18]`那样直接获取内容..有可能吗?对不起,如果这是愚蠢的问题
  • @Aux 你没有提到header 的类型,但我很确定它是char []char*。在这两种情况下,header[18] 返回char(在 Intel 平台上为 8 位类型)。之后,将&amp;header[18](类型为char*)转换为int*,解引用(“内容运算符”)提供int(在英特尔平台上为32位类型)。
  • 是的,声明中是char header[54]。但为什么它是 char 类型?是因为bmp的头信息在char中?
  • @Aux 它是char 类型,使单个字节可寻址。考虑以下反例:int header[54]; 提供 54 个ints。假设int 有 32 位 = 4 字节,那么这将是 216 字节——可能太长了。在 C 中,指针算术也考虑指针类型。因此,header[18] 将返回从字节 18 * 4 = 72 开始的元素 18。偏移量错误(根据 BMP 文档。)请注意,在 int 数组中,字节 18 根本不可寻址(不是一个元素的地址)。元素 4 从字节 16 开始,接下来是字节 20。
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 2014-12-26
  • 2019-12-03
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
相关资源
最近更新 更多