C++ 如何读取大位图图像的大小
我在读取大位图图像时遇到问题。请注意,这是一个24位BMP文件。 所以我有一张800x600的图片。 在文件中,它告诉了我得到的宽度和高度 宽度(4字节): 高度(4字节): 我已使用Paint.NET和MS Paint程序导出了这两个程序。两者的输出相同。 似乎当图像变大时,计算就会出错。 对于小图像(100x100等),结果就是我想要的。 我已经测试过手动改变大小(宽度=800;),它完全符合我的需要。 我要做的是将所有字节相加,并将它们放在一个整数上 示例:(我将文件存储在名为store的向量上): 然后我让程序创建一个文件,告诉我宽度是如何存储的C++ 如何读取大位图图像的大小,c++,bitmap,binary,hex,decimal,C++,Bitmap,Binary,Hex,Decimal,我在读取大位图图像时遇到问题。请注意,这是一个24位BMP文件。 所以我有一张800x600的图片。 在文件中,它告诉了我得到的宽度和高度 宽度(4字节): 高度(4字节): 我已使用Paint.NET和MS Paint程序导出了这两个程序。两者的输出相同。 似乎当图像变大时,计算就会出错。 对于小图像(100x100等),结果就是我想要的。 我已经测试过手动改变大小(宽度=800;),它完全符合我的需要。 我要做的是将所有字节相加,并将它们放在一个整数上 示例:(我将文件存储在名为store的
ofstream s("hht.txt");
s << width;
s << "\n";
s << dec << width;
s << "\n";
s << hex << width;
s.close();
那么,我做错了什么
注意:
-宽度信息位于位置0x12,高度信息位于0x16。
-文件是800x600。
-我不知道高度是多少,但我也知道它是错的。计算宽度的方法有一些问题
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)
为什么这适用于小数字?答案是,你将把一个数字与数字中的3对零相加,通常需要乘以这些数字才能得到它们的真实值。(示例:32的宽度为20 00 00,将0x20+0x00+0x00+0x00相加,得到0x20,十进制数仍然为32)
如果您还没有注意到,位图以小端点顺序保存值。换句话说,宽度的值不会是0x20030000(十进制为537067520),而是0x00000320(十进制为800,位图的宽度)
width=*重新解释强制转换(&store[0x12])
在这种情况下可能会起作用,但这不仅会打破别名规则,而且只有在UINT也是little endian的情况下,这才适用于您的实现。如果它们是big-endian,那么您的宽度将被计算为0x20030000(537067520),而不是0x00000320(800)。尝试
store[0x12]+store[0x13]当您看到像1024这样的数字时,您会加1+0+2+4吗?尝试width=*reinterpret_cast(&store[0x12])
)@user3804254:您看到的是32位小尾数十六进制数。0x00000320等于十进制中的800,0x00000258等于600。这还不足以作为这里的答案,我懒得在这里解释变量的内存布局——你可能会在网上找到一些关于它的信息:P。正如已经指出的,阅读关于变量大小和小端机器的内容。
35
35
23
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
width = *reinterpret_cast<uint32_t>(&store[0x12])