2016-01-19 18 views
0

我有一个关于如何读取位图头文件的简单问题。在C中指定位图文件中的十六进制值

我有位图阵列是这样的:

typedef unsigned char byte; 
char bitmap[(188*180)+1024+54]; //The image size is 188*180 + the header file of 54 bytes+ the pallete table´s 1024 bytes 

I'm根据BMP头指定的值,但具有that's比一个字节大的值时,我有一个问题。例如,我的图像宽度为128,十六进制为0x120。不过,我不能简单地说:

bitmap[19] = 0x120; 

因为that's大于一个字节。根据我阅读的内容,我有一个双字来存储我的图像高度(即4个字节),因此我可以使用bitmap[20],bitmap[21]bitmap[22]来存储整个数字。

我该如何划分数字以获得存储在头文件中的相同值?我不确定在打开bmp文件时是否添加或读取了单个十六进制数字。

+0

查找描述位图头的'struct'定义,并注意字节顺序。你*可以*将数字分割成字节,但是字节顺序仍然是一个问题。 –

+0

在C中,标准字节与'char'相同,所以'typedef'明确无用,令人困惑。如果打算使用8位类型(即八位字节),请注意一个字节不一定有8位。对于固定宽度(和特定编码)使用'stint.h'类型。还要注意'char'没有标准符号。 – Olaf

+0

您还需要研究“每像素位数”(您的是8位)和“跨度”,因为位图行长度可能会大于图像宽度。 –

回答

1

TL; DR

的值被读出作为单一DWORD(32位)数。


BMP文件格式是在Wikipedia在互联网上的许多地方所描述的,以及。请注意正确的偏移量是18,而不是你在你的问题中建议的19。因此,四个字节是在偏移18,19,20和21

在您的代码:

typedef unsigned char byte; 
char bitmap[(188*180)+1024+54]; 

到图像的宽度强制0x120,你可以这样做:

bitmap[18] = 0x20; 
bitmap[19] = 0x01; 
bitmap[20] = 0x00; 
bitmap[21] = 0x00; 

或者在一般情况下:

uint32_t width = ...; // 0x120 in your case, any value in general case 
bitmap[18] = width & 0xff; 
bitmap[19] = (width >> 8) & 0xff; 
bitmap[20] = (width >> 16) & 0xff; 
bitmap[21] = (width >> 24) & 0xff; 

注意,最不显著字节应该在LO wer地址(little-endian顺序) - 这不总是记录在案,但在Windows中讨论数据结构时总是暗示它。

+0

感谢您的回答。这正是我需要的! –