windows位图和调色板

上传人:小** 文档编号:46749092 上传时间:2018-06-27 格式:DOC 页数:172 大小:2.11MB
返回 下载 相关 举报
windows位图和调色板_第1页
第1页 / 共172页
windows位图和调色板_第2页
第2页 / 共172页
windows位图和调色板_第3页
第3页 / 共172页
windows位图和调色板_第4页
第4页 / 共172页
windows位图和调色板_第5页
第5页 / 共172页
点击查看更多>>
资源描述

《windows位图和调色板》由会员分享,可在线阅读,更多相关《windows位图和调色板(172页珍藏版)》请在金锄头文库上搜索。

1、第第 1 章章 Windows 位图和调色板位图和调色板1.1 位图和调色板的概念位图和调色板的概念如今 Windows(3.x 以及 95,98,NT)系列已经成为绝大多数用户使用的操作系统,它比DOS 成功的一个重要因素是它可视化的漂亮界面。那么 Windows 是如何显示图象的呢?这就要谈到位图(bitmap)。我们知道,普通的显示器屏幕是由许许多多点构成的,我们称之为象素。显示时采用扫描的方法:电子枪每次从左到右扫描一行,为每个象素着色,然后从上到下这样扫描若干行,就扫过了一屏。为了防止闪烁,每秒要重复上述过程几十次。例如我们常说的屏幕分辨率为 640480,刷新频率为 70Hz,意思

2、是说每行要扫描 640 个象素,一共有 480 行,每秒重复扫描屏幕 70 次。我们称这种显示器为位映象设备。所谓位映象,就是指一个二维的象素矩阵,而位图就是采用位映象方法显示和存储的图象。举个例子,图 1.1 是一幅普通的黑白位图,图 1.2 是被放大后的图,图中每个方格代表了一个象素。我们可以看到:整个骷髅就是由这样一些黑点和白点组成的。图图 1.1 骷髅骷髅图图 1.2 放大后的骷髅位图放大后的骷髅位图那么,彩色图是怎么回事呢?我们先来说说三元色 RGB 概念。我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)组合而成。有的颜色含有红色成分多一些,如深红;有的含有红色成分少一些

3、,如浅红。针对含有红色成分的多少,可以分成 0 到 255 共 256 个等级,0 级表示不含红色成分;255 级表示含有 100%的红色成分。同样,绿色和蓝色也被分成 256 级。这种分级概念称为量化。这样,根据红、绿、蓝各种不同的组合我们就能表示出 256256256,约 1600 万种颜色。这么多颜色对于我们人眼来说已经足够丰富了。表表 1.1 常见颜色的常见颜色的 RGB 组合值组合值颜色RGB红25500蓝02550绿00255黄2552550紫2550255青0255255白255255255黑000灰128128128你大概已经明白了,当一幅图中每个象素赋予不同的 RGB 值时,

4、能呈现出五彩缤纷的颜色了,这样就形成了彩色图。的确是这样的,但实际上的做法还有些差别。让我们来看看下面的例子。有一个长宽各为 200 个象素,颜色数为 16 色的彩色图,每一个象素都用 R、G、B 三个分量表示。因为每个分量有 256 个级别,要用 8 位(bit),即一个字节(byte)来表示,所以每个象素需要用 3 个字节。整个图象要用 2002003,约 120k 字节,可不是一个小数目呀!如果我们用下面的方法,就能省的多。因为是一个 16 色图,也就是说这幅图中最多只有 16 种颜色,我们可以用一个表:表中的每一行记录一种颜色的 R、G、B 值。这样当我们表示一个象素的颜色时,只需要指

5、出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第 0 行为 255,0,0(红色),那么当某个象素为红色时,只需要标明 0 即可。让我们再来计算一下:16 种状态可以用 4 位(bit)表示,所以一个象素要用半个字节。整个图象要用 2002000.5,约 20k 字节,再加上表占用的字节为 316=48 字节.整个占用的字节数约为前面的 1/6,省很多吧?这张 R、G、B 的表,就是我们常说的调色板(Palette),另一种叫法是颜色查找表LUT(Look Up Table),似乎更确切一些。Windows 位图中便用到了调色板技术。其实不光是 Windows 位图,许多图象文

6、件格式如 pcx、tif、gif 等都用到了。所以很好地掌握调色板的概念是十分有用的。有一种图,它的颜色数高达 256256256 种,也就是说包含我们上述提到的 R、G、B 颜色表示方法中所有的颜色,这种图叫做真彩色图(true color)。真彩色图并不是说一幅图包含了所有的颜色,而是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。表示真彩色图时,每个象素直接用 R、G、B 三个分量字节表示,而不采用调色板技术。原因很明显:如果用调色板,表示一个象素也要用 24 位,这是因为每种颜色的索引要用 24 位(因为总共有 224种颜色,即调色板有 224行),和直接用 R,G,B 三个分量

7、表示用的字节数一样,不但没有任何便宜,还要加上一个 2562562563 个字节的大调色板。所以真彩色图直接用 R、G、B 三个分量表示,它又叫做 24 位色图。1.2 bmp 文件格式文件格式介绍完位图和调色板的概念,下面就让我们来看一看 Windows 的位图文件(.bmp 文件)的格式是什么样子的。bmp 文件大体上分成四个部分,如图 1.3 所示。位图文件头 BITMAPFILEHEADER位图信息头 BITMAPINFOHEADER调色板 Palette实际的位图数据 ImageDate图图 1.3 Windows 位图文件结构示意图位图文件结构示意图第一部分为位图文件头 BITMA

8、PFILEHEADER,是一个结构,其定义如下:typedef struct tagBITMAPFILEHEADER WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER; 这个结构的长度是固定的,为 14 个字节(WORD 为无符号 16 位整数,DWORD 为无符号32 位整数),各个域的说明如下:bfType指定文件类型,必须是 0x424D,即字符串“BM”,也就是说所有.bmp 文件的头两个字节都是“BM”。bfSize指定文件大小,包括这 14

9、 个字节。bfReserved1,bfReserved2 为保留字,不用考虑bfOffBits为从文件头到实际的位图数据的偏移字节数,即图 1.3 中前三个部分的长度之和。第二部分为位图信息头 BITMAPINFOHEADER,也是一个结构,其定义如下:typedef struct tagBITMAPINFOHEADERDWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LON

10、G biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER; 这个结构的长度是固定的,为 40 个字节(LONG 为 32 位整数),各个域的说明如下:biSize指定这个结构的长度,为 40。biWidth指定图象的宽度,单位是象素。biHeight指定图象的高度,单位是象素。biPlanes必须是 1,不用考虑。biBitCount 指定表示颜色时要用到的位数,常用的值为 1(黑白二色图), 4(16 色图), 8(256 色), 24(真彩色图)(新的.bmp 格式支持 32 位色,这里就不做讨论了

11、)。biCompression指定位图是否压缩,有效的值为 BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows 定义好的常量)。要说明的是,Windows 位图可以采用 RLE4,和 RLE8 的压缩格式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即 biCompression 为BI_RGB 的情况。biSizeImage指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:biSizeImage=biWidth biHeight要注意的是:上述公式中的 biWidth必须是 4 的整倍数(所以不是 biWidth,而是 bi

12、Width,表示大于或等于 biWidth 的,最接近 4 的整倍数。举个例子,如果 biWidth=240,则biWidth=240;如果 biWidth=241,biWidth=244)。如果 biCompression 为 BI_RGB,则该项可能为零biXPelsPerMeter指定目标设备的水平分辨率,单位是每米的象素个数,关于分辨率的概念,我们将在第 4章详细介绍。biYPelsPerMeter指定目标设备的垂直分辨率,单位同上。biClrUsed指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为 2biBitCount。biClrImportant指定本图象中重要的颜色数

13、,如果该值为零,则认为所有的颜色都是重要的。第三部分为调色板 Palette,当然,这里是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,前面已经讲过,是不需要调色板的,BITMAPINFOHEADER 后直接是位图数据。调色板实际上是一个数组,共有 biClrUsed 个元素(如果该值为零,则有 2biBitCount个元素)。数组中每个元素的类型是一个 RGBQUAD 结构,占 4 个字节,其定义如下:typedef struct tagRGBQUAD BYTE rgbBlue; /该颜色的蓝色分量BYTE rgbGreen; /该颜色的绿色分量BYTE rgbRed; /该颜色的

14、红色分量BYTE rgbReserved; /保留值 RGBQUAD; 第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该象素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的 R、G、B 值。下面针对 2 色、16 色、256 色位图和真彩色位图分别介绍。对于 2 色位图,用 1 位就可以表示该象素的颜色(一般 0 表示黑,1 表示白),所以一个字节可以表示 8 个象素。对于 16 色位图,用 4 位可以表示一个象素的颜色,所以一个字节可以表示 2 个象素。对于 256 色位图,一个字节刚好可以表示 1 个象素。对于真彩色图,三个字节才能表示 1 个象素,哇,好费空间呀!

15、没办法,谁叫你想让图的颜色显得更亮丽呢,有得必有失嘛。要注意两点:(1) 每一行的字节数必须是 4 的整倍数,如果不是,则需要补齐。这在前面介绍biSizeImage 时已经提到了。(2) 一般来说,.bMP 文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素接下来是倒数第二行左边第一个象素,左边第二个象素依次类推 ,最后得到的是最上面一行的最右一个象素。好了,终于介绍完 bmp 文件结构了,是不是觉得头有些大?别着急,对照着下面的程序,你就会很清楚了(我最爱看源程序了,呵呵)。1.3 显示一个显示一个 bmp 文件的文件的 C

16、程序程序下面的函数 LoadBmpFile,其功能是从一个.bmp 文件中读取数据(包括BITMAPINFOHEADER,调色板和实际图象数据),将其存储在一个全局内存句柄hImgData 中,这个 hImgData 将在以后的图象处理程序中用到。同时填写一个类型为HBITMAP 的全局变量 hBitmap 和一个类型为 HPALETTE 的全局变量 hPalette。这两个变量将在处理 WM_PAINT 消息时用到,用来显示位图。该函数的两个参数分别是用来显示位图的窗口句柄,和.bmp 文件名(全路径)。当函数成功时,返回 TRUE,否则返回FALSE。BITMAPFILEHEADER bf;BITMAPINFOHEADER bi;BOO

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 宣传企划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号