无法使用 C 编程从 bmp 图像中检索准确的二进制数据
Not able to retrieve exact binary data from bmp image using C programming
我试图使用 C 编程从 bmp 图像中获取准确的二进制数据。请在下面找到代码。排除头数据后,我试图将二进制数据复制到一个新文件,但数据是错误的。我正在尝试使用 Arduino 板在 LED 板(32 x 8)上显示图像(32 x 8)。我是新来的。任何人都可以帮助我为什么数据是错误的。请同时找到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
预期二进制数据:(根据 link https://www.dcode.fr/binary-image)
00000010000000000010000000000010
00000001000000000001000000000001
00000000100000000000100000000000
00000000010000000000010000000000
00000000001000000000001000000000
00000000000100000000000100000000
10000000000010000000000010000000
01000000000001000000000001000000
已从 link 下载了文件,这是问题的原因。
头字节(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);
除非我们有实际的文件,否则推测毫无意义。
我试图使用 C 编程从 bmp 图像中获取准确的二进制数据。请在下面找到代码。排除头数据后,我试图将二进制数据复制到一个新文件,但数据是错误的。我正在尝试使用 Arduino 板在 LED 板(32 x 8)上显示图像(32 x 8)。我是新来的。任何人都可以帮助我为什么数据是错误的。请同时找到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
预期二进制数据:(根据 link https://www.dcode.fr/binary-image)
00000010000000000010000000000010
00000001000000000001000000000001
00000000100000000000100000000000
00000000010000000000010000000000
00000000001000000000001000000000
00000000000100000000000100000000
10000000000010000000000010000000
01000000000001000000000001000000
已从 link 下载了文件,这是问题的原因。
头字节(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);
除非我们有实际的文件,否则推测毫无意义。