图像编程基础
1、 有关位图
有一个长宽各为200个象素,颜色数为16色的彩色图,每一个象素都用R,G,B三个
分量表示,因为每个分量有256个级别,要用8位即一个字节来表示,所以每个象素需要用
3个字节。整个图象要用200*200*3,约120k字节。
这幅图中最多只有16种颜色,我们可以用一个表:表中的每一行记录一种颜色的R,G,B值。这样当我们表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个象素为红色时,只需要标明0即可。
再来计算一下:16种状态可以用4位表示,所以一个象素要用半个字节。整个图象要用200*200*0.5,约20k字节,再加上表占用的字节为3*16=48字节.整个占用的字节数约为前面的1/6!
2、Windows位图结构
3、位图头文件的结构
第一部分为位图文件头BITMAPFILEHEADER,是一个结构,其定义如下:
typedef struct tagBITMAPFILEHEADER{
WORD bfType;
DWORD bfSize;指定文件大小(包括这14个字节)
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;(从文件头到数据区的偏移量)
} BITMAPFILEHEADER;
这个结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数)
4、位图信息头的结构
第二部分为位图信息头BITMAPINFOHEADER,其主要字段如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;指定这个结构的长度,为40
LONG biWidth;指定图象的宽度,单位是象素
LONG biHeight;
WORD biBitCount;颜色的位数,一般为1、4、8、24
DWORD biSizeImage;
} BITMAPINFOHEADER;
这个结构的长度是固定的,为40个字节(WORD为无符号16位整数,DWORD无符
号32位整数,LONG为32位整数)
biSizeImage字段
指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:
biSizeImage=biWidth‘ *biHeight
要注意的是:上述公式中的biWidth‘必须是4的整倍数(所以不是biWidth,而是biWidth‘ ,表示大于或等于biWidth的,离4最近的整倍数。举个例子,如果biWidth=240,则biWidth‘ =240;如果biWidth=241,biWidth‘ =244)
一定要注意:每行所占字节长度始终是4的倍数,或者每行所占位长度是32的倍数。如果不是,则需要补齐
5、调色板
调色板实际上是一个四元数组,则有2的iBitCount次方个元素)。数组中每个元素的类
型是一个RGBQUAD结构,占4个字节.
typedef struct tagRGBQUAD{
BYTE rgbBlue; //蓝色分量
BYTE rgbGreen; //绿色分量
BYTE rgbRed; //红色分量
BYTE rgbReserved; //保留值
} RGBQUAD;
注意:24位真彩色图中没有调色板数据
6、实际的位图数据区
第四部分就是实际的图象数据了。
对于用到调色板的位图,图象数据就是该像素颜在调色板中的索引值
对于真彩色图,图象数据就是实际的R,G,B值。下面就2色,16色,256色位图和真彩
色位图分别介绍。
对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个像素。
对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素。
对于256色位图,一个字节刚好可以表示1个像素。
对于真彩色图,三个字节才能表示1个像素。
BMP文件的数据从下到上,从左到右的。