C中bmp的图像数据

时间:2013-11-25 06:45:08

标签: c binary binaryfiles monochrome

如何将单色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]);

使用十六进制编辑器观察输出 hex output of monochrome bmp image

突出显示的数据我希望存储在数据数组中,以便我可以在代码中进一步使用它。

然而,filename.bin中的输出是

0  16777215 63 63 63 95 95 95
31 31       31 31 31 31 31 31

我是这个领域的新手。有人可以帮我解决我出错的地方吗?

1 个答案:

答案 0 :(得分:4)

数据实际上没有问题 问题是你用错误的方法打印它们。

尝试替换您的代码:

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]);

由于%d用于带符号的小数,而%x用于十六进制。请参阅the manual page of printf

中的The conversion specifier部分

<强>编辑:

您在评论中发布了新问题:

  

十六进制输出为0x00 0xffffff 0x3f 0x3f 0x3f 0x5f 0x5f 0x5f 0x1f 0x1f 0x1f 0x1f 0x1f 0x1f 0x1f 0x1f可以解释输出是如何存储的吗?我无法获得相同的输出 - user2967899 7分钟前

这是我编辑的答案。

假设:您的工作平台正常,short的大小为2个字节,long的大小为4个。 根据{{​​1}}的定义,我们知道字段struct BitMap的偏移量为0x36。比较图像,我们知道数据应为(十六进制):

data

然后你得到的结果似乎很奇怪,因为data[0]: 0000 0000 data[1]: ffff ff00 ...... data[1]而不是0x00ffffffff。不过那是对的。这是由于结束,请首先阅读此维基页面:http://en.wikipedia.org/wiki/Endianness
由于十六进制编辑器以字节的实际顺序表示数据,并且我假设您正在使用一个小端机器(这个星球上的大多数PC都有),这个顺序与您的数据的实际顺序相反。 0xffffff00

long