如何将单色bmp图像文件(在我的例子中是16*16像素)转换为二进制格式?此代码读取位图信息。我必须将像素信息存储到一个数组中&它没有正确存储。我已经分享了密码

#pragma pack(push, 1)

typedef struct BitMap
   {
short Signature;
long Reserved1;
long Reserved2;
long DataOffSet;
long Size;
long Width;
long Height;
short Planes;
short BitsPerPixel;
long Compression;
long SizeImage;
long XPixelsPreMeter;
long YPixelsPreMeter;
long ColorsUsed;
long ColorsImportant;
long data[16];
}BitMap;
#pragma pack(pop)

正在读取图像文件:
struct BitMap source_info;
struct Pix source_pix;

FILE *fp;
FILE *Dfp;
Dfp=fopen("filename.bin","wb")

if(!(fp=fopen("filename.bmp","rb")))
 {
    printf(" can not open file");
    exit(-1);
 }

fread(&source_info, sizeof(source_info),1,fp);
printf("%d\n",source_info.DataOffSet);
printf("%d\n",source_info.Width*source_info.Height);
for(i=0;i<16;i++)
fprintf(Dfp,"%d\t",source_info.data[i]);

使用十六进制编辑器观察到的输出是
突出显示了我想存储在数据数组中的数据,这样我可以在代码中进一步使用它。
但是filename.bin中的输出是
0  16777215 63 63 63 95 95 95
31 31       31 31 31 31 31 31

我是这个领域的新手。有人能帮我找出哪里出错了吗?

最佳答案

实际上数据没有问题。
问题是你用错误的方式打印它们。
尝试替换代码:

printf("%d\n",source_info.DataOffSet);
printf("%d\n",source_info.Width*source_info.Height);
for(i=0;i<16;i++)
    fprintf(Dfp,"%d\t",source_info.data[i]);

有了这个:
printf("%x\n",source_info.DataOffSet);
printf("%x\n",source_info.Width*source_info.Height);
for(i=0;i<16;i++)
    fprintf(Dfp,"%x\t",source_info.data[i]);

As%d表示有符号小数,%x表示十六进制。参见the manual page of The conversion specifier中的printf部分
编辑:
当您在评论中发布新问题时:
十六进制输出为0x00 0xffffff 0x3f 0x3f 0x3f 0x5f 0x5f 0x5f 0x1f 0x1f 0x1f 0x1f 0x1f 0x1f 0x1f 0x1f 0x1f 0x1f 0x1f 0x1f能否解释如何存储输出?我无法获得相同的输出-用户2967899 7分钟前
这是我编辑过的答案。
假设:你的工作平台是正常的,short的大小是2字节,long的大小是4字节。
根据struct BitMap的定义,我们知道字段data的偏移量为0x36。对比我们知道的图像,数据应该是(十六进制):
data[0]: 0000 0000
data[1]: ffff ff00
......

然后你得到的结果看起来很奇怪,因为data[1]0x00ffffffff而不是0xffffff00。但这是正确的。这是由endianess引起的,请先阅读此wiki页面:http://en.wikipedia.org/wiki/Endianness
由于十六进制编辑器以字节的实际顺序表示数据,我假设您使用的是一个小型endian机器(这个星球上大多数PC都有),所以这个顺序正好与long中数据的实际顺序相反:
/* data in C */
unsigned long x = 305419896; /* 305419896 == 0x12345678 */

/* arithmetically the four bytes in x: */
/* 0x12 0x34 0x56 0x78 */

/* the real order to be observed in a hex-editor due to endianess: */
/* 0x78 0x56 0x34 0x12 */

/* so this holds true in C: */
unsigned char *a = &x;
assert(a[0] == 0x78);
assert(a[1] == 0x56);
assert(a[2] == 0x34);
assert(a[3] == 0x12);

关于c - C中bmp的图像数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20186269/

10-13 09:32