位图⽂件解析-位图(bmp)、图标(ico)与光标(cur)⼀、位图(bmp)
1.位图简介
BMP(全称Bitmap)是Windows操作系统中的标准图像⽂件格式,可以分成两类:设备相关位图(DDB)和设备⽆关位图(DIB),使⽤⾮常⼴。它采⽤位映射存储格式,除了图像深度可选以外,不采⽤其他任何压缩,因此,BMP⽂件所占⽤的空间很⼤。BMP⽂件的图像深度可选lbit、4bit、8bit及24bit。BMP⽂件存储数据时,图像的扫描⽅式是按从左到右、从下到上的顺序。由于BMP⽂件格式是Windows环境中交换与图有关的数据的⼀种标准,因此在Windows环境中运⾏的图形图像软件都⽀持BMP图像格式。
BMP位图⽂件默认的⽂件扩展名是.BMP,有时它也会以.DIB或.RLE作扩展名。
2.整体结构
BMP格式的⽂件从头到尾依次是如下信息:
bmp⽂件头(bmp file header):共14字节;
位图信息头(bitmap information):共40字节;
调⾊板(color palette):可选;
位图点阵数据(bits data);
24与32位真彩⾊位图没有颜⾊表,所以只有1、2、4这三部分。
3.bmp⽂件头
bmp⽂件头结构体为BITMAPFILEHEADER,共14字节,定义如下:
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //⽂件标识,规定为0x4D42,字符显⽰就是'BM'
DWORD bfSize; //⽂件⼤⼩
WORD bfReserved1; //保留,必须设置为0
WORD bfReserved2; //保留,必须设置为0
DWORD bfOffBits; //从头到点阵数据的偏移
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
4.位图信息头
位图信息头包括BITMAPINFOHEADER结构体与掩码(可选)两部分。BITMAPINFOHEADER结构体⼀共40字节,定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //位图信息头的⼤⼩,⼀般为40
LONG biWidth; //位图的宽度,单位:像素
LONG biHeight; //位图的⾼度,单位:像素
WORD biPlanes; //颜⾊平⾯数,⼀般为1
WORD biBitCount; //⽐特数/像素数
DWORD biCompression; //压缩类型,BI_RGB(0)为不压缩
DWORD biSizeImage; //位图数据的⼤⼩,当⽤BI_RGB格式时,可以设置为0
LONG biXPelsPerMeter; //⽔平分辨率,单位:像素/⽶
LONG biYPelsPerMeter; //垂直分辨率,单位:像素/⽶
DWORD biClrUsed; //调⾊板的颜⾊数,为0则颜⾊数为2的biBitCount次⽅
DWORD biClrImportant; //重要的颜⾊数,0代表所有颜⾊都重要
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
biSize:⼀般为40,如果⼤于40,说明后⾯有3个DWORD的掩码。⼀般16位与32位位图有掩码,代表RGB分别占⽤哪⼏位,此时biCompression=BI_BITFIELDS。
biHeight:⼀般⼤于0,代表位图倒⽴,图像数据是从左下⾓到右上⾓排列的;如果为负说明正向,位图⾼度为-biHeight。
biPlanes:bmp⽂件为1。但是ico/cur⽂件可能⼤于1。
biBitCount:1位(单⾊),2位(4⾊,CGA),4位(16⾊,VGA),8位(256⾊),16位(增强⾊),24位(真彩⾊)和32位等。
16位位图常⽤的有555与565两种存储格式。这两种的主要区别在biCompression,如果biCompression=BI_RGB,此时位图为555的位图,如果biCompression=BI_BITFIELDS,此时位图可能为565的位图(要求掩码为0xF800、0x07E0、0x001F),此时有掩码出现。
5.调⾊板
16、24与32位位图没有调⾊板。调⾊板就是⼀个颜⾊的索引,为结构体RGBQUAD的数组,数组长度为biClrUsed,如果
biClrUsed=0则数组长度为2的biBitCount次⽅。RGBQUAD结构体定义如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
6.位图数据
如果biHeight>0,代表位图倒⽴,图像数据是从左下⾓到右上⾓排列的;相反,如果biHeight<0,代表位图正向,图像数据是从左上⾓到右下⾓排列的。
如果是24位⾊图,按照BGR的顺序排列,32位⾊图按照BGRAlpha排列。
位图数据排列还有⼀个规则,就是对齐。
Windows默认的扫描的最⼩单位是4字节,如果数据对齐满⾜这个值的话对于数据的获取速度等都是有很⼤的增益的。因此,BMP图像顺应了这个要求,要求每⾏的数据的长度必须是4的倍数,如果不够需要进⾏⽐特填充(以0填充),这样可以达到按⾏的快速存取。这样的话,位图数据的⼤⼩就不⼀定是宽x⾼x每像素字节数了,因为每⾏还可能有0填充。
填充后的每⾏数据如下:
icon图标库
其中,BPP是每像素的⽐特数(Bits Per Pixel),即biBitCount,Width是宽度,单位是像素即bfWidth。
⼆、图标(ico)
1.简介
ICO是Windows的图标⽂件格式,图标⽂件可以存储单个图案、多尺⼨、多⾊板的图标⽂件。⼀个图标实际上是多张不同格式的图⽚的集合体,并且还包含了⼀定的透明区域。
ICON⽂件结构有点类似BMP⽂件,不过因为ICON⽂件⽀持多资源,所以⽐BMP⽂件多了⼀个索引⽬录的结构,以供检索⽂件内的各个图标资源。图像数据部分除了多⼀段1bpp的掩码部分以外,剩余的部分和BMP⽂件的位图信息段及图像信息段是相同的。
2.整体结构
Icon⽂件结构由两部分组成:icon⽂件头和多张bmp图⽚数据。bmp图⽚数据没有BITMAPFILEHEADER⽂件头,只有BITMAPINFOHEADER信息头。
3.Icon⽂件头
Icon⽂件头结构体如下:
typedef struct
{
BYTE bWidth; //图像宽度,单位:像素
BYTE bHeight; //图像⾼度,单位:像素
BYTE bColorCount; //颜⾊数
BYTE bReserved; //保留,为0
WORD wPlanes; //平⾯数,⼀般为1
WORD wBitCount; //每像素⽐特数
DWORD dwBytesInRes; //数据块⼤⼩
DWORD dwImageOffset;//数据块偏移量
} ICONDIRENTRY, *LPICONDIRENTRY;
typedef struct
{
WORD idReserved; //保留,为0
WORD idType; //⽂件类型,图标为1,光标为2
WORD idCount; //图象个数
ICONDIRENTRY idEntries[1]; // An entry for each image (idCount of 'em)
} ICONDIR, *LPICONDIR;
每个Icon⽂件都起始于ICONDIR结构体,然后接idCount个ICONDIRENTRY结构体数组,然后再接idCount个数据块,每个数据块都是没有BITMAPFILEHEADER⽂件头的bmp图⽚数据。
4.bmp图⽚数据
Icon⽂件中的bmp图⽚数据,包括信息头、调⾊板、XOR点阵数据、AND点阵掩码4部分,与bmp⽂件中的信息头、调⾊板、点阵数据相同。不同点在于,信息头中的biheight变量,⽽在ICON⽂件⾥,可能由于采⽤了两段掩码图像数据的缘故,该变量的值⼀般设定为⾼度象素量的2倍。
掩码的⽤途:
' AND位掩码 XOR位掩码 显⽰'
' 0 0 ⿊⾊'
' 0 0-F 调⾊板指定⾊'
' 1 0 屏幕,透明'
' 1 1 屏幕的反⾊,⼀般不⽤。
三、光标(cur)
1.简介
光标⽂件扩展名⼀般为.cur。与图标⽂件Icon⼀样,是特殊类型的⼩位图。⼀般情况下,你可以把⼀个
图标⽂件改名后直接作为⿏标指针来使⽤。当然,⼀些⾊彩丰富的⼤图标,如果⽤作⿏标指针的话,在硬件不⾜的情况下,会出现闪烁的现象。
对于光标⽂件来说,它与图标⽂件(*.ico)的不同点主要在于:它使⽤了热点标志。热点标志是指你按下⿏标按钮时,真正的按下是在光标图形的那⼀个点上发⽣的。因为⿏标是⼀幅图形,所以,需要为它指定⼀个具体的点(相对于这个图形左上⾓的位置在X⽅向和Y⽅向的偏移量)。如果不指定,这两个值就是0,那么,热点就在⿏标指针的左上⾓。对于⼀些特别的⿏标指针来说,这样显然是不合适的,例如在MS Office中当⿏标位于页⾯的左边附近时,会显⽰⼀个向右的箭头,这样的情况下,热点如果还在左上⾓,就与⼈们的直观理解有区别了。
2.数据结构
光标⽂件与图标⽂件的数据结构及其相似,不同点在于:ICONDIR结构体中的idType成员光标为2,⽽图标为1。ICONDIRENTRY结构体中的wPlanes与wBitCount不再代表原有含义,wPlanes代表热点的X坐标,wBitCount代表热点的Y坐标。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论