一.位图文件的基本结构
一个典型的位图文件由以下几个部分组成:
1.文件头(BITMAPFILEHEADER):这部分用于识别文件是否为位图文件,并提供文件大小和位图数据的位置等信息。它通常占据14字节
2.位图信息头(BITMAPINFOHEADER):此部分提供图像的尺寸、颜色深度、压缩方式和颜色索引等详细信息。对于不包含掩码的情况,它占据40字节。如果包含掩码,则后面跟随3个DWORD的掩码。
3.调色板(Color Palette):对于1位、4位和8位颜色深度的位图,存在一个调色板,它是一个RGBQUAD结构体数组,定义了每个颜色索引对应的具体颜色。每个颜色对应4个字节,颜色数量决定调色板长度。
4.位图数据(Bitmap Data):这是文件的主体部分,实际存储了图像的像素数据。像素数据的排列方式通常是从左到右、从下到上。
二.示例解析
这里以深度为1,2048*1080大小,调色板为红,蓝,数据前半部分为1,后半部分为0的位图举例:
1.文件头(BITMAPFILEHEADER):
// 文件类型,固定为0x424D(BM)
unsigned short fileType = 0x424D;
// 文件大小276542字节 = 14(文件头) + 40(信息头) + 8(调色板) + 256*1080(数据)
//因为这里是单色图,所以调色板只有两个颜色,体现在后面的信息头里
unsigned int fileSize = 0x04383e;
// 保留字段1,设为0
unsigned short reserved1;
// 保留字段2,设为0
unsigned short reserved2;
// 数据偏移量0x3e(62) = 14(文件头) + 40(信息头) + 8(调色板),后面就是数据区
unsigned int dataOffset;
2.位图信息头(BITMAPINFOHEADER):
// 信息头大小 0x28(40)
unsigned int headerSize;
// 图像宽度0x800 = 2048
int width;
// 图像高度 0x438 = 1080
int height;
// 平面数,固定为1
unsigned short planes;
// 颜色位数,这是深度为1,代表两种颜色
unsigned short bitCount;
// 压缩类型,一般为0(不压缩)
unsigned int compression;
// 图像数据大小(有时为0是合法的)
//如果biSizeImage为0,这可能表明图像数据是连续存储的,没有额外的填充或压缩。
//在这种情况下,图像数据的大小可以计算得出,或者由文件的总大小减去文件头和信息头的大小来确定
unsigned int imageSize;
// 水平分辨率
int xPixelsPerMeter;
// 垂直分辨率
int yPixelsPerMeter;
// 使用的颜色数,设为2
unsigned int colorsUsed;
// 重要的颜色数,设为2
unsigned int importantColors;
3.调色板(Color Palette):
byte A //透明色分量默认0xFF
byte R //红色分量
byte G //绿色分量
byte B //蓝色分量
//颜色1 ff ff 00 00 显示红色索引0
//颜色2 ff 00 00 ff 显示蓝色索引1
这里默认应该是黑白两色,这里处理一下声明调色板的作用,显示如下
4.位图数据(Bitmap Data):
图像下部分数据: 下半部分对应红色,对应索引0,数据为0;
图像上部分数据: 上半部分显示蓝色,对应索引1,数据为1;