[代码片段]读取BMP文件(二)
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 }