bmp文件包含了 位图文件头 位图信息头 颜色数据
显卡能直接显示bmp文件,显示其他类型的文件必须要经过一个解码过程
这里简单介绍一下行程编码压缩法 (网络传输过程中 数据越小越好 又能让人能看得懂你的意思)
基本思路是把数据看成一个线性序列,而这些数据序列组织方式分成两种情况:一种是连续的重复数据块,另一种是连续的不重复数据块。对于连续的重复数据快采用的压缩策略是用一个字节(我们称之为数据重数属性)表示数据块重复的次数,然后在这个数据重数属性字节后面存储对应的数据字节本身(此思想来自网络(不过和我的想法差不多))
举个例子: AAAAAAAABBCCCCC 压缩后便成为了8A2B5C
转到我们的bmp的思路来讲一下位图文件:
(1.简单来说文件头是一个结构体 Bitmapfileheader)查看我们的MSDN可以看到这个结构体的内容
(
解释一下源代码
成员有五个<pre name="code" class="cpp">//WORD 其实是typedef unsigned short WORD类型
//DWORD 其实是typedef unsigned long DWORD类型
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //一定是'B' 'M' 分别是 bm 代表的bmp的文件标志
DWORD bfSize; //文件的总大小(从bfsize开始计算)
WORD bfReserved1; //文件的保留成员1
WORD bfReserved2; //文件的保留成员2
DWORD bfOffBits; //颜色数据的起始字节
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
)
我也来举一个例子
那么文件头我们分析完了我们来分析一下信息头
BITMAPINFOHEADER(信息头)
typedef struct tagBITMAPINFOHEADER{ DWORD biSize; //本结构体大小 差不多是40 LONG biWidth; //位图像素宽度 LONG biHeight; //位图像素高度 WORD biPlanes; //调色板 24 bitmap 为 1 WORD biBitCount; //表示1像素的位数 DWORD biCompression; //是否压缩 24位位图是0 DWORD biSizeImage; //颜色数据总大小一般为0主要用于如果是经过压缩的位图 则本成员有效
//为什么要隔开 因为下面4个都可以填0 因为在显示器用不到这个 LONG biXPelsPerMeter; //x方向每米有几个像素 LONG biYPelsPerMeter; //y方向每米有几个像素 DWORD biClrUsed; //使用的颜色是数量 DWORD biClrImportant; //使用的重要颜色数量 } BITMAPINFOHEADER, *PBITMAPINFOHEADER;
接下来就是咱们的颜色数据
这就是基本的bmp介绍!