在C中为位图文件指定数组中的十六进制值

时间:2016-01-19 14:54:03

标签: c bitmap vga

我有一个关于如何读取位图头文件的简单问题。

我有这样的位图数组:

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

我根据bmp标头指定了值,但是当一个值大于一个字节时我有一个问题。例如,我的图像宽度是288,十六进制是0x120。但是,我不能简单地说:

 bitmap[19] = 0x120;

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

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

1 个答案:

答案 0 :(得分:1)

TL; DR

这些值被读取为单个DWORD(32位)数字。

BMP文件格式在Wikipedia以及Internet上的许多地方都有描述。请注意,正如您在问题中所建议的那样,正确的偏移量是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;

请注意,最不重要的字节应该位于较低的地址(小端序) - 这并不总是记录在案,但在Windows中讨论数据结构时总是暗示。