首页 > 解决方案 > 无法使用 C 编程从 bmp 图像中检索精确的二进制数据

问题描述

我试图使用 C 编程从 bmp 图像中获取确切的二进制数据。请在下面找到代码。排除标头数据后,我尝试将二进制数据复制到新文件,但数据错误。我正在尝试使用 Arduino 板在 LED 板(32 x 8)上显示图像(32 x 8)。我是新来的。任何人都可以帮助我为什么数据是错误的。也请找到 led_image。

led_image

C程序:

#include <stdio.h>

int main(int argc, char*argv[])
{
    FILE *ptr_bmp_in;
    FILE *ptr_text_out;
    int c;
    int height = 0;
    int width = 0;
    int imagesize = 0;
    int bits = 0;

    ptr_bmp_in = fopen("led_image.bmp", "rb");
    ptr_text_out = fopen("led_binary.txt", "w");

    if (!ptr_bmp_in)
    {
        printf("Unable to open file\n");
        return 1;
    }
    fseek(ptr_bmp_in, 0x12, SEEK_SET);
    fread(&width, 4, 1, ptr_bmp_in);
    printf("\n Width: %d", width);
    fseek(ptr_bmp_in, 0x16, SEEK_SET);
    fread(&height, 4, 1, ptr_bmp_in);
    printf("\n Height: %d", height);
    fseek(ptr_bmp_in, 0x36, SEEK_SET);

    imagesize = height * width;
    printf("\n Imagesize: %d", imagesize);

    while ((c = fgetc(ptr_bmp_in)) != EOF)
    {
        for (int i = 0; i <= 7; i++)
        {
            if (c & (1 << (7 - i)))
            {
                fputc('1', ptr_text_out);
            }
            else
            {
                fputc('0', ptr_text_out);
            }
            bits++;
        }
        printf(" bits: %d", bits);
        if (bits >= imagesize) {
            printf("BREAK THE LOOP");
            break;
        }   
    }
    fclose(ptr_bmp_in);
    fclose(ptr_text_out);
    printf("Writing done\n");

    return 0;
}

二进制数据:

00000000000000000000000000000000
00000001000000010000000100000000
00000010000000100000001000000000
00000011000000110000001100000000
00000100000001000000010000000000
00000101000001010000010100000000
00000110000001100000011000000000
00000111000001110000011100000000

预期的二进制数据:(根据链接https://www.dcode.fr/binary-image

00000010000000000010000000000010
00000001000000000001000000000001
00000000100000000000100000000000
00000000010000000000010000000000
00000000001000000000001000000000
00000000000100000000000100000000
10000000000010000000000010000000
01000000000001000000000001000000

标签: cimage-processingbmp

解决方案


从链接下载文件后,这是您的问题的原因。

头字节(14)如下:

42 4D 38 05 00 00 00 00 00 00 36 04 00 00

打破它:根据维基百科:

  • 42 4D:“BM”
  • 38 05 00 00: 文件长 1336 字节
  • 需要接下来的两个字(4 个字节),零
  • 36 04 00 00: 像素数据的偏移量

引用印第安纳琼斯的话:“他们挖错地方了!”

这个:

fseek(ptr_bmp_in, 0x36, SEEK_SET);

需要是:

fseek(ptr_bmp_in, 0x0436, SEEK_SET);

除非我们有实际的文件,否则推测毫无意义。


推荐阅读