【发布时间】:2014-09-10 21:27:35
【问题描述】:
我在读取大位图图像时遇到问题。请注意,这是一个 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。 -我不知道高度是多少,但我也知道它是错误的。
【问题讨论】:
-
试试
store[0x12] + store[0x13] << 8 + store[0x14] << 16 + store[0x15] << 24,看看效果如何。 -
当你看到像1024这样的数字时,你加1+0+2+4吗?
-
试试
width = *reinterpret_cast<uint32_t>(&store[0x12]);) -
@user3804254:您正在查看 32 位 little-endian 十六进制数字。 0x00000320 等于十进制的 800,0x00000258 是 600。
-
这里只是一个答案是不够的,我也懒得在这里解释变量的内存布局——你可能会在网上找到一些关于它的东西:P。正如已经指出的那样,请阅读有关可变大小和小端机器的信息。
标签: c++ bitmap binary hex decimal