这是我的第一篇文章,所以如果我写错了,我很抱歉。我无法理解如何从标题中提取高度和宽度。这是代码直到我感兴趣的部分。
GLuint load_bmp(const char* imagepath)
{
unsigned char header[54];
unsigned int imageSize;
unsigned int dataPos;
unsigned int width;
unsigned int height;
unsigned char *data;
FILE *file=fopen(imagepath,"rb");
if(!file)
{
return false;
}
else
{
if(fread(header,1,54,file)!=54)
{
return false;
}
if((header[0]!='B')||(header[1]!='M'))
{
return false;
}
dataPos=*(int*)&header[0x0A];//This line
imageSize=*(int*)&header[0x22];//This line
height=*(int*)&header[0x12];//This line
width=*(int*)&header[0x16];//This line
}
}
如何使用这4行代码获得正确的值?
答案 0 :(得分:1)
标头被读入缓冲区。然后,有问题的行将地址转换为该缓冲区,就像它们指向二进制整数一样,然后读取它们。
因此,例如,高度是一个四字节整数,由从头[0x12]到头[0x15]的字节表示。代码将第一个字节的地址转换为指向一个整数,然后读取该整数指针的内容。我不知道C ++是否比C有更多的保证,但如果没有,那么代码会对int的大小和字节表示做出一些假设,这些假设在某些环境中不起作用。