Saturday, January 27, 2007

关于位图

最近要陆续写点点关于技术类文章了。
首先就是对于很常见的位图的解释,点阵图,三个字就可以概括了,其实大家应该也都知道。
这个文章是对位图就编程方向的理解。

在一个网站上找到比较好的位图解释:“位图图像由像素组成,每个像素都被分配一个特定位置和颜色值。在处理位图图像时,您编辑的是像素而不是对象或形状,也就是说,编辑的是每一个点。

位图图像与分辨率有关,即在一定面积的图像上包含有固定数量的像素。因此,如果在屏幕上以较大的倍数放大显示图像,或以过低的分辨率打印,位图图像会出现锯齿边缘。”

然后说色彩模式,有那么几种色彩模式,但是我就只说下RGB吧,生活用得最多的RGB:就是红绿蓝三色乱搭配。

说这么多了后面的就是对位图的操作,大多数都是摘抄的:
以BMP位图为例:
---- BMP文件结构

---- 1. BMP文件组成

---- BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

---- 2. BMP文件头

---- BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。

---- 其结构定义如下:

typedef struct tagBITMAPFILEHEADER{
WORDbfType; // 位图文件的类型,必须为BMD
WORDbfSize; // 位图文件的大小,以字节为单位
WORDbfReserved1; // 位图文件保留字,必须为0
WORDbfReserved2; // 位图文件保留字,必须为0
DWORDbfOffBits; // 位图数据的起始位置,以相对于位图// 文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;

----位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息。
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; // 本结构所占用字节数
LONGbiWidth; // 位图的宽度,以像素为单位
LONGbiHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount// 每个像素所需的位数,必须是1(双色), //4(16色)8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩), // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位
LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数
LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
}
BITMAPINFOHEADER;
----颜色表

----颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。

RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD {BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
BYTErgbGreen; // 绿色的亮度(值范围为0-255)
BYTErgbRed; // 红色的亮度(值范围为0-255)
BYTErgbReserved;// 保留,必须为0
}
RGBQUAD;颜色表中RGBQUAD结构数据的个数有biBitCount来确定:当biBitCount=1,4,8时,分别有2,16,256个表项;当biBitCount=24时,没有颜色表项。

位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
}BITMAPINFO;

现在关键的东西都出来了,我的目的是辨别出我指定的色,然后在位图中定位,返回它的坐标,还在努力中。

No comments: