BMP数据实例

1 .文件 结构
 
位图文件数据存储结构(字节单位):
 
       前14字节(BITMAPFILEHEADER 文件头数据结构)
       详细结构参考上面文档。
 
       之后40字节(BITMAPINFOHEADER 位图信息头数据结构)
       详细结构参考上面文档。
 
       之后 调色板数据
只有小于等于8位象素才需要调色板,
 
       最后,位图数据
       大小:象素宽 × 象素高 × 每象素字节数
      
 
       注意:位图文件中的颜色格式与平时的颜色组织格式稍有不同,它的颜色格式是
       蓝色 blue
       绿色 green
       红色 red
 
       平时的是 Red,Greed,Blue
 
2. 例子附带说明
   关于位图文件内部数据是怎么组织的?关键是看参数biBitCount的值,该参数只有5个可选值1、4、8、24、32。根据它们的选值情况,文件有3种组织格式,下面分别用例子说明:
       公共部分:文件头
       前面 14 个字节,
typedef struct tagBITMAPFILEHEADER
 {
    WORD    bfType; // 必填“ BM ”或“ 0x4D42
    DWORD   bfSize; // 必填 文件总的字节大小
    WORD    bfReserved1;// 必填 0
    WORD    bfReserved2;// 必填 0
    DWORD   bfOffBits;      // 必填,象素值开始位置到文件头位置的偏移量
 } BITMAPFILEHEADER;
 
       接着 40 个字节,
typedef struct tagBITMAPINFOHEADER
{
 DWORD      biSize; // 必填 0x28
   LONG       biWidth; // 必填 象素宽
   LONG       biHeight; // 必填 象素高
   WORD       biPlanes; // 必填 1
   WORD       biBitCount; // 必填 1 4 8 24 32 之一,该值很重要!
   DWORD      biCompression;// 必填 BI_RGB,BI_RGB8,BI_RLE4 之一,一般是 BI_RGB
   DWORD      biSizeImage; // 可选填,值为象素信息的字节总数
   LONG       biXPelsPerMeter;// 可选填,一般为 C4 0E 00 00 ,也可填 0
   LONG       biYPelsPerMeter; // 可选填,同上
   DWORD      biClrUsed; // 必填,一般为 0
   DWORD      biClrImportant;// 必填,一般为 0
} BITMAPINFOHEADER                           
 
       不同的部分:象素值
根据 biBitCount 参数有以下 3 种情况
<!--[if !supportLists]--> (1)   <!--[endif]--> 有调色板( biBitCount 参数值为 1 4 8
此时位图文件先跟一段调色板颜色数据,再跟象素的颜色索引信息数据;
<!--[if !supportLists]--> (2)   <!--[endif]--> 无调色板( biBitCount 参数值为 24
此时直接跟一段象素数据,每个象素由 3 个字节表示颜色值,顺序 BGR
<!--[if !supportLists]--> (3)   <!--[endif]--> 无调色板( biBitCount 参数值为 32
此时直接跟一段象素数据,每个象素由 4 个字节表示颜色值,顺序 BGR
 
 
1 1 位象素单色 4 × 4 位图,假设第 1 3 象素为黑色,其他都为白色,那么有下面的数据来表示该位图的象素颜色值
00 00 00 00 FF FF FF 00; 50 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00 00.
说明:前面 8 个字节,是调色板的值,单色只有黑色和白色两种,它们的 RGB 表示就是前面的 8 个字节。 RGB 0 0 0 )为黑色, RGB 255 255 255 )为白色,
50 00 00 00 表示第一行位图象素,这里只有前 4 位有效,其他位都是补位而已。 5 的二进制就是 0101 ,它对应第一行的四个象素的颜色索引“黑白黑白”;
F0 00 00 00 表示第二行的位图象素,这里也是前 4 位有效, F 的二进制是 1111 ,正好对应颜色索引“白白白白”;
其他行的象素颜色一样表示法。
 
注:这里单色,所以参数biBitCount1,即1位表示一个象素,所以4×4的每行就只有4位来表示象素颜色就够了,但是,系统规定必须32位对齐,所以需要280来来补足。故这里的每行都用4个字节来表示,只是后面28位没有实际用处而已。
 
注意 :每个调色板中的一种颜色,必须用 4 个字节表示( RGB 绝对值)
注意 :关于象素每行补位算法,到底要补多少位,这可以不用操心,用算法
int i = ((Bitmap.bmWidth *wBitCount+31)/32)*4*Bitmap.bmHeight  得到的 i 就是: 描述位图象素颜色总的要用到的字节数。该字节数减去该行象素的字节数,就是补位的字节数。
 
调色板的颜色个数为 2 biBitCount 次幂,
 
2 4 位象素 8 色的 4 × 4 位图,假设第一行第一象素为绿色,第三象素为红色,第二象素为蓝色,底为黑色,则有下面的数据来表示该位图文件的颜色值
RGBQUAD pallete[16] = { (0x0, 0x0, 0x0, 0x0), (0xFF, 0xFF, 0xFF, 0x0), (0xFF,0x0,0x0,0x0), (0x0,0xFF,0x0,0x0),( 0x0,0x0,0xFF,0x0),( 0xFF,0xFF,0x0,0x0),( 0xFF,0x0,0xFF,0x0),
(0x0,0xFF,0xFF,0x0),( 0xFF,0x80,0x0,0x0),( 0xFF,0x0,0x80,0x0),( 0xFF,0x80,0x80,0x0),
(0xFF,0xFF,0x80,0x0),( 0x80,0x80,0x80,0x0),( 0x80,0x0,0x0,0x0),( 0x,0x80,0x0,0x0),
(0x0,0x0,0x80,0x0)};
这是调色板颜色值,后面要跟各个象素的颜色索引值,它们共同组成象素颜色值的表述
32 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00
第一行“ 32 40 00 00 ”分别表示“绿蓝红黑”后 16 位为补位;
其他行一样的理解。
 
3 24 位象素彩色的 4 × 4 位图,假设第一行第一象素为绿色,第三象素为红色,第二象素为蓝色,底为白色,则有下面的数据来表示该位图文件的颜色值
00 FF 00 FF 00 00 00 00 FF FF FF FF 00(标志换行)
FF FF FF FF FF FF FF FF FF FF FF FF 00
FF FF FF FF FF FF FF FF FF FF FF FF 00
FF FF FF FF FF FF FF FF FF FF FF FF 00
 
注意 :24位象素的位图文件没有调色板,但是,它的每个象素也不是用4字节表示,而是用3字节表示,即没有那个颜色结构的保留字节。但是,这样就会出现每行字节不能16位对齐的问题,所以每行完了必须要有个行结束字节“00”,
 
4 32 位象素真彩色的 4 × 4 位图,假设第一行第一象素为绿色,第三象素为红色,第二象素为蓝色,底为白色,则有下面的数据来表示该位图文件的颜色值
00 FF 00 00 FF 00 00 00  00 00 FF 00 FF FF FF 00
FF FF FF 00  FF FF FF 00 FF FF FF 00 FF FF FF 00
FF FF FF 00  FF FF FF 00 FF FF FF 00 FF FF FF 00
FF FF FF 00  FF FF FF 00 FF FF FF 00 FF FF FF 00
 
32 位象素的位图,也没有调色板,但是它的颜色值是用4字节来表示的,除了RGB值外,还有一个保留值,始终为0。
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值