1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #pragma pack(2)
5
6 /*定义WORD为两个字节的类型*/
7 typedef unsigned short WORD;
8 /*定义DWORD为e四个字节的类型*/
9 typedef unsigned long DWORD;
10
11 /*位图文件头*/
12 typedef struct BMP_FILE_HEADER
13 {
14 WORD bType; /* 文件标识符 */
15 DWORD bSize; /* 文件的大小 */
16 WORD bReserved1; /* 保留值,必须设置为0 */
17 WORD bReserved2; /* 保留值,必须设置为0 */
18 DWORD bOffset; /* 文件头的最后到图像数据位开始的偏移量 */
19 } BMPFILEHEADER;
20
21 /*位图信息头*/
22 typedef struct BMP_INFO
23 {
24 DWORD bInfoSize; /* 信息头的大小 */
25 DWORD bWidth; /* 图像的宽度 */
26 DWORD bHeight; /* 图像的高度 */
27 WORD bPlanes; /* 图像的位面数 */
28 WORD bBitCount; /* 每个像素的位数 */
29 DWORD bCompression; /* 压缩类型 */
30 DWORD bmpImageSize; /* 图像的大小,以字节为单位 */
31 DWORD bXPelsPerMeter; /* 水平分辨率 */
32 DWORD bYPelsPerMeter; /* 垂直分辨率 */
33 DWORD bClrUsed; /* 使用的色彩数 */
34 DWORD bClrImportant; /* 重要的颜色数 */
35 } BMPINF;
36
37 /*彩色表*/
38 typedef struct RGB_QUAD
39 {
40 WORD rgbBlue; /* 蓝色强度 */
41 WORD rgbGreen; /* 绿色强度 */
42 WORD rgbRed; /* 红色强度 */
43 WORD rgbReversed; /* 保留值 */
44 } RGBQUAD;
45
46 int main()
47 {
48 FILE *fp;
49 BMPFILEHEADER fileHeader;
50 BMPINF infoHeader;
51 long offset, bmpImageSize, width, height, bytesPerPixel, size, bitCount;
52 // int i, j;
53 // unsigned char **p;
54 WORD c;
55
56 if((fp = fopen("C:\\Users\\Mirgo\\Desktop\\5.bmp", "rb")) == NULL)
57 {
58 printf("Cann't open the file!\n");
59 exit(0);
60 }
61
62 fseek(fp, 0, 0);
63 fread(&fileHeader, sizeof(fileHeader), 1, fp);
64 fread(&infoHeader, sizeof(infoHeader), 1, fp);
65
66 //计算并输出位图数据的偏移量,图像的大小,宽度和高度,每个像素点所占的字节
67 size = fileHeader.bSize;
68 offset = fileHeader.bOffset;
69 bmpImageSize = infoHeader.bmpImageSize;
70 width = infoHeader.bWidth;
71 height = infoHeader.bHeight;
72 bitCount = infoHeader.bBitCount;
73 bytesPerPixel = infoHeader.bBitCount / 8;
74
75 printf("%d %d %d %d %d %d %d\n", size, offset, bmpImageSize, width, height, bitCount, bytesPerPixel);
76
77 //输出每个像素点所占字节中的内容
78 c = fgetc(fp);
79 while (!feof(fp))
80 {
81 printf("%x", c>0?1:0);
82 c = fgetc(fp);
83 }
84
85 printf("\n");
86
87 system("pause");
88
89 fclose(fp);
90
91 return 0;
92 }