BMP图像存储格式

http://www.cnblogs.com/kekec/archive/2011/08/04/2127297.html


BMP有单色,16色,256色,24位,32位几种类型位图。

BMP在磁盘上是按以下顺序存储的:

  ---------------header部分开始----------------

[位图文件头TBitmapFileHeader]     // 14个字节

[位图信息头TBitmapInfo]               // 40个字节

  --------------- body部分开始 ----------------

[图像数据BGRA]                            // 32位位图含Alpha值

 

(1)位图文件头

?
1
2
3
4
5
6
7
typedef  struct  tagBITMAPFILEHEADER { // bmfh
     WORD     bfType;      // 文件标识‘BM’
     DWORD    bfSize;      // 用字节表示的整个文件的大小
     WORD     bfReserved1;  // 保留字节,为0
     WORD     bfReserved2;  // 保留字节,为0
     DWORD    bfOffBits;   // 图象数据RGBA的起始地址的偏移值  为54
} BITMAPFILEHEADER;

(2)位图信息头

?
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef  struct  tagBITMAPINFOHEADER{ // bmih
     DWORD   biSize;      // 位图信息头(Bitmap Info Header)的长度,为40 
     LONG    biWidth;    // 位图的宽度,以象素为单位
     LONG    biHeight;     // 位图的高度,以象素为单位 
     WORD    biPlanes;    // 位图的位面数(注:该值将总是1)
     WORD    biBitCount    // 每个象素的位数,设为24(表示24Bit位图)
     DWORD   biCompression;   // 压缩说明,设为0(不压缩)
     DWORD   biSizeImage;    // 用字节数表示的位图数据的大小(该数必须是4的倍数)
     LONG    biXPelsPerMeter;   // 用象素/米表示的水平分辨率 (一般设为0)
     LONG    biYPelsPerMeter;   // 用象素/米表示的垂直分辨率(一般设为0)
     DWORD   biClrUsed;   // 位图使用的颜色数(一般设为0)
     DWORD   biClrImportant;    // 指定重要的颜色数(一般设为0)
} BITMAPINFOHEADER;
PS:
位面数是调色板的数量。 位图数据一样,如果调色板不一样。图像颜色和感觉也不一样的。多数图像就一套调色板或没有,所以多数BMP 图像格式里这个设置 1

(3)图像数据BGRA

       单色:      1个bit表示1个像素

       16色:     4个bit表示1个像素

       256色:   8个bit表示1个像素

       24位:     24个bit表示1个像素       //BGR

       32位:     32个bit表示1个像素       //BGRA

 

  *** 数据存放顺序 ***

       

注:图片的左下角为图像文件数据块的起点,从左到右,从下到上依次存储图像各像素值。如上图所示!

 

(4)需要注意的几点

  a.  像素中个颜色分量顺序为 BGRA -- Blue  Green  Red  Alpha

以下是RGB宏的定义

?
1
2
3
#define RGB(r, g ,b)  ((DWORD) (((BYTE) (r) | \
     (( WORD ) (g) << 8)) | \
     ((( DWORD ) ( BYTE ) (b)) << 16)))

可通过BYTE GetRValue(DWORD rgb)   BYTE GetGValue(DWORD rgb)    BYTEGetBValue(DWORD rgb)来获取各个分量的值。

  b. 对于数据区域而言,每行的数据它必须凑满4字节,如果没有满,则用冗余的数据来补齐。

      如:对于24位位图,假设一行有w个像素,那么一行的像素数为:4*((3*w+3)/4)   // 注意(3*w+3)/4是在做整除操作

 

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值