C++ - 从 BMP 文件中读取每像素的位数

标签 c++ bmp

我正在尝试获取 bmp 文件中每个像素的位数。根据维基百科,它应该在第 28 个字节。所以在读取一个文件后:

// Przejscie do bajtu pod ktorym zapisana jest liczba bitow na pixel
        plik.seekg(28, ios::beg);

        // Read number of bytes used per pixel
        int liczbaBitow;
        plik.read((char*)&liczbaBitow, 2);

        cout << "liczba bitow " << liczbaBitow << endl;

但是 liczbaBitow(应该保存每个像素值的位数的变量)是 -859045864。我不知道它是从哪里来的……我迷路了。

有什么想法吗?

最佳答案

为了澄清@TheBluefish 的回答,这段代码有错误

// Read number of bytes used per pixel
int liczbaBitow;
plik.read((char*)&liczbaBitow, 2);

当您使用 (char*)&libczbaBitow 时,您正在获取一个 4 字节整数的地址,并告诉代码将 2 个字节放在那里。

该整数的其他两个字节未指定且未初始化。在本例中,它们是 0xCC,因为这是系统使用的堆栈初始化值。

但是,如果您从另一个函数调用它或重复调用它,您可能会期望堆栈包含其他虚假值。

如果您初始化变量,您将获得您期望的值。

但是还有另一个错误.. 字节顺序在这里也很重要。此代码假设机器 native 字节顺序与文件规范中的字节顺序完全匹配。有许多不同的位图格式,但根据您的引用,维基百科文章说:

All of the integer values are stored in little-endian format (i.e. least-significant byte first).

这和你的一样,显然也是x86小端。其他字段未定义为小端,因此当您继续解码图像时,您必须留意它。

理想情况下,您会读入字节数组并将字节放在它们所属的位置。 参见 Convert Little Endian to Big Endian

int libczbaBitow;
unsigned char bpp[2];
plik.read(bpp, 2);
libczbaBitow = bpp[0] | (bpp[1]<<8);

关于C++ - 从 BMP 文件中读取每像素的位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37667283/

相关文章:

c++ - 错误 : T does not name a type - For specialisation using strongly typed enums

java - 使用 ImageIO 编写透明的 BMP

C++ 图像处理 - 将图像文件读入二维数组

c++ - 如何使用 C++ 创建 BMP 文件?

java - 在 Java 中更改 BMP 图像的 DPI

c++ - 为什么 remove_copy_if 返回一个空 vector ?

c++ - SFML 不会在 CodeBlocks 13.12 中运行

c++ - 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐,可能有 operator new 等)

C++ 队列不喜欢少于 8 个字符*

C++ 读取 BMP 文件仅在行填充等于 3 字节时有效