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

标签 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 header 指定值,但当值大于一个字节时我有一个问题。例如,我的图像宽度是288,即十六进制的0x120。但我不能简单地说:

 bitmap[19] = 0x120;

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

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

最佳答案

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;

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

关于c - 在 C 中为位图文件指定数组中的十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34879923/

相关文章:

bitmap - 如何为 Xamarin.Forms 使用位图?

actionscript-3 - 在 Flex 中,如何创建、填充和显示位图?

assembly - 使用 CGA/EGA/VGA 平面图形模式

c - 是否有可能在 C 中为 Rf_eval R 捕获错误?

c - C 编程中如何搜索 struct 数组

c - 从源代码构建 libjepeg-turbo 不会构建库 libturbojpeg.so*

malloc 之后调用 free() 会导致意外行为

algorithm - 计算位图图像中完全绑定(bind)的孔?

.net - .NET 上是否存在任何方法来检测是否仍插入带有 VGA 插头的监视器?

c - 如何将 256 色转换为最接近匹配的 RGB 颜色?