本来是打算弄个BadApple玩玩,不过不满足于简单地读取文本文件并输出,所以最后变成了研究如何用C语言读取位图文件并通过二维数组来存储像素信息。
第一步自然是弄清楚bmp的文件格式。在各种位图格式中,bmp因为数据块通常没有压缩,每个像素都由独立的几个或者几组bits来表示,读写方式都比较简单,只需要按照格式要求通过fread读取二进制文件就行。
bmp文件大概有四部分组成,第一部分是文件类型数据,存放跟bmp文件类型有关的信息,共占用14字节。第二部分是图像信息数据,保存位图图像相关的信息,共40字节,第三部分是一个可选的调色板,最后是像素信息区。
各部分中具体的字段含义见下表:
按照上面的格式说明,我们定义几个结构体来描述他们:
#pragma once
#include<stdio.h>
typedef unsigned int DWORD; // 4bytes
typedef unsigned short WORD; // 2bytes
typedef signed long LONG; // 4bytes
typedef unsigned char BYTE; // 1bytes
#pragma pack(push)
#pragma pack(1)// 修改默认对齐值
/*位图文件文件头结构体*/
typedef struct tagBITMAPFILEHEADER {
WORD bFileType;
DWORD bFileSize;
WORD bReserved1;
WORD bReserved2;
DWORD bPixelDataOffset;
}BITMAPFILEHEADER; //14bytes
#pragma pack(pop)
/*位图文件信息头结构体*/
typedef struct tagBITMAPINFOHEADER {
DWORD bHeaderSize; // 图像信息头总大小(40bytes)
LONG bImageWidth; // 图像宽度(像素)
LONG bImageHeight; // 图像高度
WORD bPlanes; // 应该是0
WORD bBitsPerPixel; // 像素位数
DWORD bCompression; // 图像压缩方法
DWORD bImageSize;