如何读取大位图图像的大小

时间:2014-07-20 03:31:15

标签: c++ bitmap binary hex decimal

我在阅读大位图图像时遇到问题。请注意,这是一个24位BMP文件。 所以我的图像大小为800x600。 在文件中,它告诉我的宽度和高度。

宽度(4个字节):

20 03 00 00

高度(4个字节):

58 02 00 00

我已经使用Paint.NET和MS Paint程序导出了它们。两者都有相同的输出。 似乎当图像变大时,计算出错了。 使用小图像(100x100等),结果就是我想要的。 我已经测试过手动更改尺寸(宽度= 800;),它可以完美地满足我的需要。 我所做的是将所有字节加起来并放在一个整数上。

示例:(我将文件存储在名为store的矢量上):

unsigned int width = store[0x12] + store[0x13] + store[0x14] + store[0x15];

然后我让程序创建一个文件来告诉我存储宽度的方式。

ofstream s("hht.txt");
        s <<  width;
        s << "\n";
        s << dec << width;
        s << "\n";
        s << hex << width;
        s.close();

这是我得到的输出:

35
35
23

那么,我做错了什么?

注意: - 宽度信息位于0x12位置,高度位于0x16。 - 文件是800x600。 - 我不知道身高是多少,但我知道这也是错的。

1 个答案:

答案 0 :(得分:0)

如何计算宽度会有一些问题。

unsigned int width = store[0x12] + store[0x13] + store[0x14] + store[0x15];

你在这里用宽度示例做的是:

unsigned int width = 0x20 + 0x03 + 0x00 + 0x00; // width = 0x23

这是十进制的:

unsigned int width = 32 + 3 + 0 + 0; // width = 35

这并不能得到20 03 00 00的实际值,因为在这种情况下03不应该代表0x03,它应该代表0x0300(十进制768)。 / p>

为什么这对小数字起作用?答案是你要将一对数字加在一起,数字中有3对零,这些数字通常需要乘以得到它们的实际值。 (示例:32的宽度将是20 00 00 00,这将加在一起0x20 + 0x00 + 0x00 + 0x00以获得0x20,这仍然是十进制的32)

如果您还没有注意到,则位图以小端顺序保存值。换句话说,宽度值一起不会是0x20030000(十进制537067520),它将是0x00000320(十进制800,位图的宽度)。

width = *reinterpret_cast<uint32_t>(&store[0x12])

可能适用于这种情况,但不仅可能会破坏别名规则,如果uint也是little-endian,这只会对您的实现起作用。如果它们是big-endian,则宽度将计算为0x20030000(537067520)而不是0x00000320(800)。