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

时间:2016-06-06 21:38:38

标签: 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。我不知道它来自哪里......我很遗憾。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

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

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

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

该整数的另外两个字节未指定且未初始化。在这种情况下,它们会0xCC,因为它是系统使用的堆栈初始化值。

但是,如果你从另一个函数或反复调用它,你可以预期堆栈包含其他虚假值。

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

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

  

所有整数值都以little-endian格式存储(即最低有效字节优先)。

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

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

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

答案 1 :(得分:2)

-859045864可以十六进制表示为0xCCCC0018。

读取第二个字节给出0x0018 = 24bpp。

这里最有可能的是,liczbaBitow被初始化为0xCCCCCCCC;而plik.read只写低16位而高16位保持不变。更改该行应解决此问题:

int liczbaBitow = 0;

虽然,特别是这样的事情,但最好使用与您的数据完全匹配的数据类型:

int16_t liczbaBitow = 0;

这可以在<cstdint>中找到。