实例-BMP文件格式详解

为了简便通过一个位深为1的小图片来详述.

先看下图片长什么样


是的,是个指针的图片


以下是分析,写的没怎么有条理,就一股脑放这了,算是个备份

arrow.bmp  126 bytes   2011/06/16  10:09:26
          -0 -1 -2 -3  -4 -5 -6 -7  -8 -9 -A -B  -C -D -E -F
00000000- 42 4D 7E 00  00 00 00 00  00 00 3E 00  00 00 28 00 [BM~.......>...(.]
00000001- 00 00 10 00  00 00 10 00  00 00 01 00  01 00 00 00 [................]
00000002- 00 00 40 00  00 00 00 00  00 00 00 00  00 00 00 00 [..@.............]
00000003- 00 00 00 00  00 00 00 00  00 00 FF FF  FF 00 FF FF [................]
00000004- 00 00 FF 9F  00 00 FF 9F  00 00 FF 3F  00 00 F7 3F [...........?...?]
00000005- 00 00 F2 7F  00 00 F0 7F  00 00 F0 0F  00 00 F0 1F [..............]
00000006- 00 00 F0 3F  00 00 F0 7F  00 00 F0 FF  00 00 F1 FF [...?...........]
00000007- 00 00 F3 FF  00 00 F7 FF  00 00 FF FF  00 00       [..............  ]
typedef struct tagBITMAPFILEHEADER {  //bmp文件头
WORD bfType; // 位图文件的类型,必须为“BM” @0x0:0x42 0x4D
DWORD bfSize; // 位图文件的大小,以字节为单位 @0x2:0x0000007E=126byte
WORD bfReserved1; // 位图文件保留字,必须为0 @0x6
WORD bfReserved2; // 位图文件保留字,必须为0 @0x8
DWORD bfOffBits; // 位图数据的起始位置,相对于位图文件头的偏移量(字节) @0xA:0x0000003e=62
} BITMAPFILEHEADER ;该结构占据14个字节。 


typedef struct tagBITMAPINFOHEADER { //位图信息头
DWORD biSize; // 本结构所占用字节数 @0xE:0000 0028=40
LONG biWidth; // 位图的宽度,以像素为单位 @0x12:0x0000 0010=16
LONG biHeight; // 位图的高度,以像素为单位 @0x16:0x0000 0010=16
WORD biPlanes; // 目标设备的平面数,必须为1 @0x1A
WORD biBitCount// 每个像素所需的位数,必须是 1( 双色), 4(16 色),8(256 色)或24(真彩色)之一 @0x1C
DWORD biCompression; //压缩类型,0(不压缩),1(BI_RLE8)或2(BI_RLE4)之一 @0x1E:0x0000 0000
DWORD biSizeImage; // 位图的大小,以字节为单位 @0x22:0x0000 0040=64
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数 @0x26:0x0000 0000
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数 @0x2A:0x0000 0000
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数 @0x2E:0x0000 0000
DWORD biClrImportant;// 位图显示过程中重要的颜色数 @0x32:  end_addr@0x35 两个头len=54
} BITMAPINFOHEADER ;该结构占据40个字节。 

颜色表@0x36 2个
          -0 -1 -2 -3  -4 -5 -6 -7  -8 -9 -A -B  -C -D -E -F
00000003-                     00 00  00 00 FF FF  FF 00

图片数据@0x3E

图片位深为1,即8像素占用一个字节.图片像素宽16,占用两个字节,对齐到4,所以一行图片数据占用4个字节
biWidth为16>0,说明图片数据倒行排列,也就是说越往后放的数据,在显示时应该在靠上的行位置显示
整理后的数据应该像这样

FF FF 00 00
F7 FF 00 00
F3 FF 00 00
F1 FF 00 00
F0 FF 00 00
F0 7F 00 00
F0 3F 00 00
F0 1F 00 00
F0 0F 00 00
F0 7F 00 00
F2 7F 00 00
F7 3F 00 00
FF 3F 00 00
FF 9F 00 00
FF 9F 00 00
FF FF 00 00 
通过颜色表,转后后,显示示意如下


FF FF 1111 1111 1111 1111                                                               
F7 FF 1111 0111 1111 1111             0                       ■                        
F3 FF 1111 0011 1111 1111             00                      ■■                      
F1 FF 1111 0001 1111 1111             000                     ■■■                    
F0 FF 1111 0000 1111 1111             0000                    ■■■■                  
F0 7F 1111 0000 0111 1111             0000 0                  ■■■■■                
F0 3F 1111 0000 0011 1111             0000 00                 ■■■■■■              
F0 1F 1111 0000 0001 1111             0000 000                ■■■■■■■            

F0 0F 1111 0000 0000 1111             0000 0000               ■■■■■■■■          
F0 7F 1111 0000 0111 1111             0000 0                  ■■■■■                
F2 7F 1111 0010 0111 1111             00 0 0                  ■■  ■■                
F7 3F 1111 0111 0011 1111             0    00                 ■      ■■              
FF 3F 1111 1111 0011 1111                  00                         ■■              
FF 9F 1111 1111 1001 1111                   00                          ■■            
FF 9F 1111 1111 1001 1111                   00                          ■■            
FF FF 1111 1111 1111 1111                                                               



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值