BMP文件格式由位图文件头、位图信息和像素数据三个部分组成。位图信息又由位图信息头和调色板数据组成。
在BMP格式中,位图文件头、位图信息头为固定长度,分别为14、40字节。调色板数据的多少与所用的色彩数有关,它的字节数是色彩数的四倍,每个调色板单元的前三个字节分别表示彩色的蓝、绿、红分量(注意不是常见的RGB,而是BGR),第四个字节备用。像素数据在文件的最后。
在Windows中,读入内在的是去掉了14字节位图头文件后的BMP文件,即设备无关位图(DIB)。
位图文件头结构
| | |
| | |
| | |
| | |
| | |
| | |
位图信息头结构
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
调色板数据
在位图文件头与位图信息头之后的是调色板数据。调色板数据是从第54字节开始存放,它的数量由图像的类型决定。
像素数据
像素数据跟在调色板数据之后,存储位置可以由位图文件头得到,要注意以下几点:
1、BMP格式每行字节数应为4的倍数
可以由下面公式计算每行的字节数:((bits)+31)/32*4,这里的bits是每一行占的位数(很巧妙吧,这个算法)
//也就是向上取整的算法,就相当于31/32得一个非常接近1的数,这样如果有余数就相当于加1.
2、像素数据是自下而上存放的,也就是从图像的最后一行开始存入文件的,从左到右的。
3、16位彩色图像采用单一位平面。
4、像素数据存放顺序为蓝、绿、红。
文件的读取与显示
在Windows系统中,存入内存的图像数据采用的是BMP格式,也即在Windows应用程序中,将图片读入内存,实际上就是将图片数据转换成BMP格式的位图。
下面是读取和显示BMP图片的代码:(不是自己写的)
int wid,hei,bits;
HBITMAP hBitmap = NULL;
LPSTR lpBits;
// 读取
void LoadBMP(LPSTR lpstrFilename)
{
}
// 显示
void DisplayDIBSection(HWND hWnd, HBITMAP hBitmap, int wid, int hei)
{
}
上面的这个显示程序体现了双缓冲显示的技术。先在内存设备描述表中画好图,再利用图像块操作函数BitBlt将图像从内存设备描述表中拷贝到“显示器”上。