Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何读取大位图图像的大小_C++_Bitmap_Binary_Hex_Decimal - Fatal编程技术网

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

C++ 如何读取大位图图像的大小,c++,bitmap,binary,hex,decimal,C++,Bitmap,Binary,Hex,Decimal,我在读取大位图图像时遇到问题。请注意,这是一个24位BMP文件。 所以我有一张800x600的图片。 在文件中,它告诉了我得到的宽度和高度 宽度(4字节): 高度(4字节): 我已使用Paint.NET和MS Paint程序导出了这两个程序。两者的输出相同。 似乎当图像变大时,计算就会出错。 对于小图像(100x100等),结果就是我想要的。 我已经测试过手动改变大小(宽度=800;),它完全符合我的需要。 我要做的是将所有字节相加,并将它们放在一个整数上 示例:(我将文件存储在名为store的

我在读取大位图图像时遇到问题。请注意,这是一个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])