BMP文件格式详解

位图文件分为四部分:
(1)文件头(BITMAP FILE HEADER)
位图文件头(BITMAPFILEHEADER)是一个结构体,长度为14字节,定义为:
typedef struct tagBITMAPFILEHEADER
{
    WORD bfType;           // 文件类型,必须是0x4D42,即字符串"BM"
    DWORD bfSize;          //文件大小,包括BITMAPFILEHEADER的14个字节
    WORD bfReserved1;   // 保留字
    WORD bfReserved2;   // 保留字
    DWORD bfOffBits;      // 从文件头到实际的位图数据的偏移字节数
} BITMAPFILEHEADER;

(2)信息头(BITMAP INFO HEADER)
位图信息头(BITMAPINFOHEADER)也是一个结构体,长度为40字节,定义为:
typedef struct tagBITMAPINFOHEADER
{
    DWORD biSize;        // 本结构的长度,为40
    LONG biWidth;        // 图象的宽度,单位是象素
    LONG biHeight;        // 图象的高度,单位是象素
    WORD biPlanes;       // 必须是1
    WORD biBitCount;   // 表示颜色时要用到的位数,1(单色), 4(16色), 8(256色), 24(真彩色)
    DWORD biCompression; // 指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS等,BI_RGB表示不压缩
    DWORD biSizeImage;     // 实际的位图数据占用的字节数,即 (biWidth × N)’ × biHeight,(biWidth × N)’是(biWidth × N) 按照4的整倍数调整后的结果,N是每个象素占用的字节数(如8位图为1、24位图为3等)
    LONG biXPelsPerMeter; // 目标设备的水平分辨率,单位是每米的象素个数(注:一般填0)
    LONG biYPelsPerMeter; // 目标设备的垂直分辨率,单位是每米的象素个数(注:一般填0)
    DWORD biClrUsed;        // 位图实际用到的颜色数,0表示颜色数为2^biBitCount
    DWORD biClrImportant; // 位图中重要的颜色数,0表示所有颜色都重要
} BITMAPINFOHEADER;

(3)调色板(Palette)
调 色板Palette针对的是需要调色板的位图,即单色、16色和256色位图。对于不以调色板方式存储的位图,则无此项信息。调色板是一个数组,共有 biClrUsed个元素(如果该值为0,则有2biBitCount个元素)。数组中每个元素是一个RGBQUAD结构体,长度为4个字节,定义为:
typedef struct tagRGBQUAD
{
 BYTE rgbBlue;        // 蓝色分量
 BYTE rgbGreen;      // 绿色分量
 BYTE rgbRed;        // 红色分量
 BYTE rgbReserved; // 保留值
} RGBQUAD;

(4)实际的位图数据(Image Date)
对于用到调色板的位图,实际的图象数据ImageDate为该象素的颜色在调色板中的索引值;对于真彩色图,图象数据则为实际的R、G、B值:
a.单色位图:用1bit就可以表示象素的颜色索引值;
b.16色位图:用4bit可以表示象素的颜色索引值;
c. 256色位图:1个字节表示1个象素的颜色索引值;
d.真彩色:3个字节表示1个象素的颜色R、G、B值。
此外,位图数据每一行的字节数必须为4的整倍数,如果不是,则需要补齐。奇怪的是,位图文件中的数据是从下到上(而不是从上到下)、从左到右方式存储的。

 

调色板分析:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值