c - 将BMP像素数据加载到数组C中

标签 c bitmap alignment fread bmp

我正在尝试将像素数据从位图读取到结构化数组中(其中包含用于颜色的 R、G 和 B 整数)。我使用 12x12px 图像只是为了测试(因为我相信 bmp 规范规定像素数据在每行末尾用零填充以使其字对齐。12px 宽度会自动字对齐。

这是我正在使用的代码。 INFOHEADERFILEHEADER 被完美解析,并创建了 IMAGEim 的 12x12 2D 数组。然而,打印每个像素的 RGB 数据会打印出垃圾。

typedef struct __attribute__((__packed__)) {
    unsigned char  b;
    unsigned char  g;
    unsigned char  r;
} IMAGE;

int main(void) {
    FILEHEADER fh;
    INFOHEADER ih;
    FILE *img = fopen("pic.bmp", "rb");
    fread(&fh, sizeof(unsigned char), sizeof(FILEHEADER), img);
    fread(&ih, sizeof(unsigned char), sizeof(INFOHEADER), img);

    IMAGE im[ih.width][ih.height];
    fseek(img, fh.imageDataOffset, 0);
    int i, j;
    for (i = ih.height-1; i >= 0; i--) {
        for (j = 0; j < ih.width; j++) {
            fread(&im[i][j], sizeof(unsigned char), sizeof(IMAGE), img);
            printf("%x%x%x ", im[i][j].r, im[i][j].g, im[i][j].b);
        }
        printf("\n");
    }
    printf("w = %d, h = %d\n", ih.width, ih.height);
}

但是,对于 12x12px 全白位图,此输出:

ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
000 ca800 ff574b 007f 001 000 b000 574bc9 07fff 44c40 ff8690 007f 
9077b0 7fff86 8000 574bca 07fff 0a00 ff7482 007f 4bc950 7fff57 2f00 86906d 
07fff 60a50 ff8690 007f 4bc9d0 7fff57 ee00 87418 000 c9300 ff574b 007f 
4bc8f0 7fff57 700 868b3c 07fff 400 000 000 820a0 7fff74 3000 574bc9 
07fff 6000 1877 000 0100 000 000 004 000 1000 000 000 
820a0 7fff74 000 0010 000 6000 1874 000 4bc8d0 7fff57 b300 868b31 
000 38b30 051f9 000 000 000 000 000 000 010 000 000 
745069 018 f700 ffffff 181a4 080 000 000 01f5 0140 000 000 

有人能看出我做错了什么吗?会不会是对齐问题?

谢谢

编辑:

这是位图文件底部的屏幕截图。似乎有 144 (12x12) 个白色像素(突出显示)。最后两个零是填充。但我的程序无法正确解析它仍然没有意义。

enter image description here

最佳答案

好吧,事实证明我将空白 bmp 保存为 8 位而不是 24 位。 8bit 使用颜色表,每个像素引用颜色表中的一个条目来获取其数据。 24位bmp每个像素使用3个字节,每个字节代表一个R、G和B值,因此不需要颜色表。

关于c - 将BMP像素数据加载到数组C中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17975703/

相关文章:

objective-c - 我为什么得到:从结果类型为char的函数返回const char *丢弃限定符

python - 带有矢量文本的 matplotlib 位图图

css - CSS/HTML5 的大小问题

html - 垂直和水平对齐

c - 使用 gdb 调试 c

c - 我的二叉搜索树程序停止工作(C)

c - 越界访问数组有多危险?

android - 将 EXIF 元数据写入 Android 中的图像

java - 检索 Facebook 个人资料图片

html - 如何创建边框图像?