bmp位图调色板
数字媒体文件格式

JPEG文件
量化表DQT部分可包含一个或者多个量化表。每个量化表都是以0XFFDB开始,其后跟2个字节的量化表长度字段;后面是一个字节的量化表序号;最后是64个字节的量化表,量化表的系数是按照Z型扫描所得的8*8量化系数的顺序存储的。帧图像开始SOF0(Start of Frame)之后有6个固有字段,分别是:① 帧开始长度,2个字节;② 精度,每个颜色分量每个像素的位数,1个字节;③ 图像高度,2个字节;④ 图像宽度,2个字节;⑤ 颜色分量数,1个字节;⑥ 各颜色分量量化设置,共9字节,对每个颜色分量有3个字节的设置,分别是ID,垂直方向的样本因子和水平方向的样本因子,量化表号。霍夫曼表DHT部分也可包含一个或者多个表,每个表均以0XFFC4开始,包含以下5个部分:① 霍夫曼表的长度;② 类型,AC或者DC;③ 索引;④ 位表;⑤ 值表。扫描开始SOS(Start of Scan)部分存储实际的编码数据,每个扫描的长度会有所不同,由紧随其后的2个字节的扫描开始长度表示,后面是1个字节的颜色分量数,后面还包括针对每个颜色分量的描述,每个分量的内容有ID号、交流系数表号和直流系数表号。在这之后就是压缩图像的数据。文件以图像结束EOI(End of Image)标识符作为文件的结束。
位图文件(BMP)

位图⽂件(BMP)位图⽂件简介BMP(Bitmap-File)格式是最常⽤的图像⽂件存取格式之⼀,是微软为其Windows环境设置的标准图像格式,BMP位图⽂件默认的⽂件扩展名是“.BMP”或者“.bmp”,有时它也会以“.DIB”或者“RLE”为扩展名。
⽤BMP格式存放的图像⼏乎可以被所有的图像显⽰软件读取。
BMP图形⽂件是Windows采⽤的图像⽂件格式,在Windows环境下运⾏的所有图像软件都⽀持BMP图像⽂件格式。
Windows系统内部个图像绘制操作都是以BMP为基础的。
Windows3.0以前的BMP⽂件格式与显⽰设备有关,因此把这种BMP图像⽂件格式称为设备相关位图(Device Dependent Bitmap,DDB)⽂件格式。
Windows3.0以后的BMP⽂件都与显⽰设备⽆关,因此把这种BMP⽂件格式称为设备⽆关位图(Device Independent Bitmap,DIB)格式。
BMP⽂件格式摘要每个BMP⽂件只能存放⼀张图像。
图像数据是否采⽤压缩⽅式存放,取决于⽂件的⼤⼩与格式,即压缩处理是BMP图像⽂件的⼀个选项,⽤户可以根据需要进⾏选择。
其中,⾮压缩格式是BMP图像⽂件所采⽤的⼀种通⽤格式,它按照⼀定的顺序忠实的记录图像中每⼀个像素的颜⾊值。
如果⽤户确定将BMP⽂件格式压缩处理,则Windows设计了⼀种压缩⽅式:如果位图为16⾊模式,则采⽤RLE4压缩⽅式,如果图像为256⾊模式,则采⽤RLE8压缩⽅式。
BMP图像数据⽂件格式可以存储为单⾊,16⾊,256⾊和真彩⾊四种图像数据,其数据的排列顺序与⼀般⽂件不同,它以图像的左下⾓作为起点存储图像,⽽不是以图像的坐上⾓为起点。
⽽且BMP图像⽂件格式中还存在另外⼀个与众不同的特点,即其调⾊板数据所采⽤的数据结构中,红,绿,蓝三种基⾊数据的排列顺序也恰好与其他图像⽂件格式相反。
总之,BMP图像⽂件格式拥有许多适合于Windows环境的新特⾊,⽽且随着Windows版本的不断更新,微软也在不断的改进BMP图像⽂件格式。
位图和调色板

第1章Windows位图和调色板1.1 位图和调色板的概念如今Windows(3.x以及95,98,NT)系列已经成为绝大多数用户使用的操作系统,它比DOS 成功的一个重要因素是它可视化的漂亮界面。
那么Windows是如何显示图象的呢?这就要谈到位图(bitmap)。
我们知道,普通的显示器屏幕是由许许多多点构成的,我们称之为象素。
显示时采用扫描的方法:电子枪每次从左到右扫描一行,为每个象素着色,然后从上到下这样扫描若干行,就扫过了一屏。
为了防止闪烁,每秒要重复上述过程几十次。
例如我们常说的屏幕分辨率为640×480,刷新频率为70Hz,意思是说每行要扫描640个象素,一共有480行,每秒重复扫描屏幕70次。
我们称这种显示器为位映象设备。
所谓位映象,就是指一个二维的象素矩阵,而位图就是采用位映象方法显示和存储的图象。
举个例子,图1.1是一幅普通的黑白位图,图1.2是被放大后的图,图中每个方格代表了一个象素。
我们可以看到:整个骷髅就是由这样一些黑点和白点组成的。
图1.1 骷髅图1.2 放大后的骷髅位图那么,彩色图是怎么回事呢?我们先来说说三元色RGB概念。
我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)组合而成。
有的颜色含有红色成分多一些,如深红;有的含有红色成分少一些,如浅红。
针对含有红色成分的多少,可以分成0到255共256个等级,0级表示不含红色成分;255级表示含有100%的红色成分。
同样,绿色和蓝色也被分成256级。
这种分级概念称为量化。
这样,根据红、绿、蓝各种不同的组合我们就能表示出256×256×256,约1600万种颜色。
这么多颜色对于我们人眼来说已经足够丰富了。
表1.1 常见颜色的RGB组合值颜色R G B红255 0 0蓝0 255 0绿0 0 255黄255 255 0紫255 0 255青0 255 255白255 255 255黑0 0 0灰128 128 128你大概已经明白了,当一幅图中每个象素赋予不同的RGB值时,能呈现出五彩缤纷的颜色了,这样就形成了彩色图。
BMP文件调色板

一.BMP文件概述BMP文件格式,又称为位图(Bitmap)或是Device Independent Device(DIB,与设备无关位图),是Windows使用的图像文件格式,位图是一个二维的位数组,它与图像的图素一一对应。
当现实世界的图像被扫描成位图以后,图像被分割成网格,并以图素作为取样单位。
在位图中的每个图素值指明了一个单位网格内图像的平均颜色。
单色位图每个图素只需要一位,灰色或彩色位图中每个图素需要多个位。
位图代表了Windows程序内储存图像信息的两种方法之一。
储存图像信息的另一种形式是metafile, Metafile储存的就是对图像如何生成的描述,而不是将图像以数字化的图标代表。
位图有两个主要的缺点。
第一个问题是容易受设备依赖性的影响。
最明显的就是对颜色的依赖性,在单色设备上显示彩色位图的效果总是不能令人满意的。
另一个问题是位图经常暗示了特定的显示分辨率和图像纵横比,位图的第二个缺点是需要很大的储存空间。
位图除空间尺寸以外,位图还有颜色尺寸。
这里指的是每个图素所需要的位数,有时也称为位图的颜色深度(color depth)、位数(bit-count)或位/图素(bpp:bits per pixel)数。
位图中的每个图素都有相同数量的颜色,每图素1位的位图称为二阶(bilevel)、二色(bicolor)或者单色(monochrome)位图。
每图素可以是0或1,0表示黑色,1可以表示白色,但并不总是这样。
对于其它颜色,一个图素就需要有多个位。
可能的颜色值等于2位数值。
用2位可以得到4种颜色,用4位可以得16种颜色,8位可得到256种颜色,16位可得到65,536种颜色,而24位可得到16,777,216种颜色。
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:bmp文件头(bmp file header):提供文件的格式、大小等信息。
位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息。
BMP 文档

BMP格式BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。
随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。
这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。
所以,目前BMP在单机上比较流行。
目录编辑本段简介BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows 环境下运行的所有图象处理软件都支持BMP图象文件格式。
Windows系统内部各图像绘制操作都是以BMP为基础的。
Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。
Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。
BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE 作扩展名)。
6.1.2 文件结构位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。
位图文件的组成结构名称符号位图文件头 (bitmap-file header) BITMAPFILEHEADER bmfh位图信息头 (bitmap-information header) BITMAPINFOHEADER bmih 彩色表 (color table) RGBQUAD aColors[]图象数据阵列字节 BYTE aBitmapBits[]位图文件结构可综合在表6-01中。
BMP文件的读写

• lpszFilter是一个包含有通配符的以“|”字符分隔的字符 串。要注意的是, 在第一个“|”字符之前是将要显示在 文件对话框的“文件类型”列表框中的信息, 第二个
“ | ”字符和第一个“ | ”字符之间的内容为对话框的过
滤器内容。在字符串szFilter的尾部, 使用两个“|”字符
而不是一个, 表示过滤器内容结束。
StretchDIBits函数简介
• • • • • • • • • • • • hdc:指向目标设备环境的句柄。 XDest:指定目标矩形左上角位置的X轴坐标,按逻辑单位来表示坐标。 YDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。 nDestWidth:指定目标矩形的宽度。 nDestHeight:指定目标矩形的高度。 XSrc:指定DIB中源矩形(左上角)的X轴坐标,坐标以像素点表示。 YSrc:指定DIB中源矩形(左上角)的Y轴坐标,坐标以像素点表示。 nSrcWidth:按像素点指定DIB中源矩形的宽度。 nSrcHeight:按像素点指定DIB中源矩形的高度。 lpBits:指向DIB位的指针,这些位的值按字节类型数组存储。 lpBitsInfo:指向BITMAPINFO结构的指针,该结构包含有关DIB方面的信息。 iUsage:表示是否提供了BITMAPINFO结构中的成员bmiColors,如果提供了, 那么该bmiColors是否包含了明确的RGB值或索引。参数iUsage必须取下列值, 这些值的含义如下: DIB_PAL_COLOR:表示该数组包含对源设备环境的 逻辑调色板进行索引的16位索引值。 DIB_RGB_COLORS:表示该颜色表 包含原义的KGB值。 dwRop:指定源像素点、目标设备环境的当前刷子和目标像素点是如何组合形成 新的图像。 返回值:如果函数执行成功,那么返回值是拷贝的扫描线数目,如果函数执行失 败,那么返回值是GDI_ERROR。 备注:。参数iUsage一般设为DIB_RGB_COLORS。dwRop一般设为SRCCOPY 。
BMP的颜色位深说明
BMP的颜色位深说明今天同事遇到一个问题,由于客户要求的图片一定是BMP R5 G6 B5模式,可是存出来的这种图片格式,在PC机上显示时,会有如下问题:第一,几乎是所有图片预览工具都看不到,第二,用画图工具打开的时候,发现首尾的顺序不对,本属于左边的一块区域被填充到了右边,而在PS里打开就很正常。
这使我有点困惑了,为什么会出现这种现像?R5 G6 B5到底又是一种什么格式呢?查过资料之后,我终于明白,原来是这样的:BMP取自位图BitMaP的缩写,也称为DIB(与设备无关的位图)是微软视窗图形子系统(GDI)内部使用的一种位图图形格式,它是微软视窗平台上的一个简单的图形文件格式。
我们知道,BMP根据颜色深度,可以分为2(1位)、16(4位)、256(8位)、65536(16位)和1670万(24位)以及32位含有alpha通道。
8位图像可以是索引彩色图像外,也可以是灰阶图像,而索引彩色图片所使用的颜色来源就是RGB颜色值。
图像上的每个点阵都是由这些调色板上的RGB值混合而来,由于这个源因,从16位开始,对于调色的板的定义就有多种模式:X1 R5 G5 B5是PC操作系统默认的16位BMP颜色位深分配格式,使用的是标准的RGB 颜色,其中X1代表1位的黑白值(或者未使用),R5代表红色位深为5位,G5代表绿色位深为5位,B5代表了蓝色位深为5位。
四个值相加刚好是16位;R5 G6 B5,电子产品中较为常用的图像模式,这种模式是红色R位深为5位,G5代表绿色G位深为6位,B5代表了蓝色B位深为5位。
三个值相加刚好是16位;这种模式常和翻转序列配合使用。
A1 R5 G5 B5,这种图像模式暂时未知主要应用于哪里。
模式是A1代表1位的alpha透明通道,R5代表红色位深为5位,G5代表绿色位深为5位,B5代表了蓝色位深为5位。
四个值相加刚好是16位;16位椐我的了解好像是没有透明通道的,为什么会有这种格式,我也不太清楚,而且这种模式在PS里一直都是打灰的,没见可以使用过,这里记录一下,有知道的朋友,我们可以一起探讨。
VC6.0下bmp位图的读取与显示
昆明理工大学(数字图像处理)实验报告实验名称:VC6.0下bmp位图的读取与显示专业:电子信息科学与技术姓名:学号:成绩:[实验目的]掌握windows BMP格式位图文件的基本格式。
会使用VC++读取图像数据并显示。
[实验内容]1、在VC6.0环境下,生成MFC应用程序框架。
2、在已生成的应用程序中,加BMP位图读取与显示的代码,从已有文件中读取bmp格式文件并在视图中显示。
[实验原理]1 、 BMP 文件组成BMP 文件由文件头、位图信息头、颜色信息和图像数据四部分组成。
位图结构如下所示:2 、 BMP 文件头BMP 文件头数据结构含有BMP 文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:•typedef struct tagBITMAPFILEHEADER{•WORD bfType; //文件类型,必须是字符串”BM”•DWORD bfSize; //指定文件大小•WORD bfReserved1; //保留字,不考虑•WORD bfReserved2; //保留字,不考虑•DWORD bfOffBits; //从文件头到位图数据的偏移字节数•} BITMAPFILEHEADER3 、位图信息头typedef struct tagBITMAPINFOHEADER{DWORD biSize; //该结构的长度,40个字节LONG biWidth; //图像的宽度,单位是像素LONG biHeight; //图像的高度,单位是像素WORD biPlanes; //必须是1WORD biBitCount //颜色位数,如1,4,8,24DWORD biCompression; //压缩类型,如BI_RGB,BI_RLE4DWORD biSizeImage; //实际位图数据占用的字节数LONG biXPelsPerMeter; //水平分辨率LONG biYPelsPerMeter; //垂直分辨率DWORD biClrUsed; //实际使用的颜色数DWORD biClrImportant; //重要的颜色数} BITMAPINFOHEADER;4、调色板typedef struct tagRGBQUAD {BYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;} RGBQUAD;用于存放图像的颜色。
BMP图片格式
BMP图片格式简介:BMP是一种与硬件设备无关的图像文件格式,使用非常广。
它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。
BMP文件的图像深度可选lbit、4bit、8bit及24bit。
BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
文件结构:典型的BMP图像文件由四部分组成:1:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
位图的类型:位图一共有两种类型,即:设备相关位图(DDB)和设备无关位图(DIB)。
DDB位图在早期的Windows系统(Windows 3.0以前)中是很普遍的,事实上它也是唯一的。
然而,随着显示器制造技术的进步,以及显示设备的多样化,DDB位图的一些固有的问题开始浮现出来了。
比如,它不能够存储(或者说获取)创建这张图片的原始设备的分辨率,这样,应用程序就不能快速的判断客户机的显示设备是否适合显示这张图片。
为了解决这一难题,微软创建了DIB位图格式。
设备无关位图 (Device-Independent Bitmap)DIB位图包含下列的颜色和尺寸信息:*原始设备(即创建图片的设备)的颜色格式。
*原始设备的分辨率。
*原始设备的调色板*一个位数组,由红、绿、蓝(RGB)三个值代表一个像素。
*一个数组压缩标志,用于表明数据的压缩方案(如果需要的话)。
bmp是什么格式
图有关的数据的一种标准,因此在Windows环境中运行的 图形图像软件都支持BMP图像格式。 典型的BMP图像文件由四部分组成: 1:位图
头文件数据结构,它包含BMP图像文件的类型、显示内 容等信息; 2:位图信息数据结构,它包含有BMP图像的宽、高、压 缩方法,以及定义颜色等信
息; 3:调色板,这个部分是可选的,有些位图需要调色板, 有些位图,比如真彩色图(24位的BMP)就不需要调色板; 4:位图数据,这部分的
BMP(全称Bitmap)是Window操作系统中的标准图像文件 格式,可以分成两类:设备相关位图(DDB)和设备无关位 图(DIB),使用非常
广。它采用位映射存储格式,除了图像深度可选以外, 不采用其他任何压缩,因此,BMP文件所占用的空间很 大。BMP文件的图像深度可选lbP文件存储数据时,图像的扫描方式 是按从左到右、从下到上的顺序。由于BMP文件格式是 Windows环境中交换与
内容根据BMP位图使用的位数不同而不同,在24位图中 直接使用RGB,而其他的小于24位的使用调色板中颜色索 引值。 bmp文件怎么打开?
这是WINDOWS的位图文件,使用画笔或者其它的图片查 看器都能打开它。
转载请保留出处,谢谢支持!
网瑞测速 /
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
调色板调色板概述每个应用程序都有自己的调色板,使用调色板时要先向系统申请,调色板分为前台调色板和后台调色板,windows为优先级高的程序分配前台调色板.我们经常会发现当启动一个大一点的程序时,桌面和其他应用程序的颜色变得粗糙起来,就是因为其他应用程序的调色板正在转为后台调色板.Windows系统内部保留了一个20种颜色的调色板,用来显示窗口,菜单等通用界面每个设备上下文都拥有一个逻辑调色板,如果要使用内部系统调色板(20种颜色)之外的颜色,则应该创建一个新的逻辑调色板并将其选入到设备上下文中.再把设备上下文中的逻辑调色板实现到系统调色板中,新的颜色才能实现.在逻辑调色板被实现到系统调色板时,Windows会建立一个调色板映射表,当设备上下文用逻辑调色板中的颜色绘图时,GDI绘图函数会查询调色板映射表以把像素值从逻辑调色板的索引转换成系统调色板的索引.创建调色板BOOL CreatePalette(LPLOGPALETTE lpLogPalette );其中lpLogPalette是一个指向LOGPALETTE 结构的指针typedef struct tagLOGPALETTE { WORD palVersion; //windows版本号,一般是0x300WORD palNumEntries; //调色板中颜色表项的数目PALETTEENTRY palPalEntry[1]; //每个表项的颜色和使用方法} LOGPALETTE;typedef struct tagPALETTEENTRY {BYTE peRed; //红(0-255)BYTE peGreen;// 绿BYTE peBlue; //蓝BYTE peFlags; //一般为0} PALETTEENTRY;上面只是建立了一个逻辑调色板,而逻辑调色板只是一张孤立的颜色表,并不能对系统产生影响,所以要使用调色板还需要下面这些函数CPalette* SelectPalette(CPalette* pPalette,BOOL bForceBackground );这个函数用来将一个调色板载入设备上下文,第一个参数是一个调色板指针,第二个参数用来指定调色板作为前景色还是背景色使用,为TURE时,作为背景色使用,为FALSE时,当窗口是活动窗口或活动窗口的子窗口是,调色板将做为前景色使用,否则做为背景色来使用.如果使用调色板的是一个内存设备上下文,则该参数被忽略.UINT RealizePalette( );该函数把设备上下文中的逻辑调色板实现到系统调色板中, 函数的返回值表明调色板映射表中有多少项被改变了这两个函数的使用如下:CPalette *pOldPalette ;CWindowDC dc(this) ;pOldPalette=dc.SelectPalette(&pal, FALSE) ;dc.RealizePalette() ;dc.SelectPalette(pOldPalette, FALSE) ;如果某一个窗口要显示特殊的颜色,那么一般应该在处理WM_PAINT消息时实现自己的逻辑调色板,也就是说,在OnPaint或OnDraw函数中重绘以前,要调用SelectPalette和RealizePalette,如果窗口显示的颜色比较重要,则要在调用SelectPalette时指定bForceBackground参数为FALSE.创建调色板的一般步骤:1 建立一个LOGPALETTE结构和PALETTEENTRY数组2 对PALETTEENTRY数组进行赋值,即创建调色板颜色表3 建立CPalette对象并使用CreatePalette函数初始化调色板对象4 使用SelectPalette函数将设备描述表和调色板联系起来5 使用CDC中的RealizePalette函数使调色板生效为了协调各个窗口对系统调色板的使用,Windows在必要的时候会向顶层窗口和重绘窗口发送消息WM_QUERYNEWPALETTE和WM_PALETTECHANGED.当某一顶层或重叠窗口被激活时,会收到WM_QUERYNEWPALETTE消息,在窗口的创建之处也会收到该消息,该消息先于WM_PAINT消息到达窗口,如果活动窗口要使用特殊的颜色,则在收到该消息时应该实现自己的逻辑调色板并重绘窗口.11.1.1 调色板的原理PC机上显示的图象是由一个个像素组成的,每个像素都有自己的颜色属性。
在PC的显示系统中,像素的颜色是基于RGB模型的,每一个像素的颜色由红(B)、绿(G)、蓝(B)三原色组合而成。
每种原色用8位表示,这样一个的颜色就是24位的。
以此推算,PC的SVGA适配器可以同时显示224约一千六百多万种颜色。
24位的颜色通常被称作真彩色,用真彩色显示的图象可达到十分逼真的效果。
但是,真彩色的显示需要大量的视频内存,一幅640×480的真彩色图象需要约1MB的视频内存。
由于数据量大增,显示真彩色会使系统的整体性能迅速下降。
为了解决这个问题,计算机使用调色板来限制颜色的数目。
调色板实际上是一个有256个表项的RGB颜色表,颜色表的每项是一个24位的RGB颜色值。
使用调色板时,在视频内存中存储的不是的24位颜色值,而是调色板的4位或8位的索引。
这样一来,显示器可同时显示的颜色被限制在256色以内,对系统资源的耗费大大降低了。
显示器可以被设置成16、256、64K、真彩色等显示模式,前两种模式需要调色板。
在16或256色模式下,程序必须将想要显示的颜色正确地设置到调色板中,这样才能显示出预期的颜色。
图11.1显示了调色板的工作原理。
使用调色板的一个好处是不必改变视频内存中的值,只需改变调色板的颜色项就可快速地改变一幅图象的颜色或灰度。
在DOS中,调色板的使用不会有什么问题。
由于DOS是一个单任务操作系统,一次只能运行一个程序,因此程序可以独占调色板。
在Windows环境下,情况就不那么简单了。
Windows是一个多任务操作系统,可以同时运行多个程序。
如果有几个程序都要设置调色板,就有可能产生冲突。
为了避免这种冲突,Windows使用逻辑调色板来作为使用颜色的应用程序和系统调色板(物理调色板)之间的缓冲。
图11.1 调色板工作原理在Windows中,应用程序是通过一个或多个逻辑调色板来使用系统调色板(物理调色板)。
在256色系统调色板中,Windows保留了20种颜色作为静态颜色,这些颜色用作显示Windows界面,应用程序一般不能改变。
缺省的系统调色板只包含这20种静态颜色,调色板的其它项为空。
应用程序要想使用新的颜色,必须将包含有所需颜色的逻辑调色板实现到系统调色板中。
在实现过程中,Windows首先将逻辑调色板中的项与系统调色板中的项作完全匹配,对于逻辑调色板中不能完全匹配的项,Windows将其加入到系统调色板的空白项中,系统调色板总共有236个空白项可供使用,若系统调色板已满,则Windows将逻辑调色板的剩余项匹配到系统调色板中尽可能接近的颜色上。
每个设备上下文都拥有一个逻辑调色板,缺省的逻辑调色板只有20种保留颜色,如果要使用新的颜色,则应该创建一个新的逻辑调色板并将其选入到设备上下文中。
但光这样还不能使用新颜色,程序只有把设备上下文中的逻辑调色板实现到系统调色板中,新的颜色才能实现。
在逻辑调色板被实现到系统调色板时,Windows会建立一个调色板映射表。
当设备上下文用逻辑调色板中的颜色绘图时,GDI绘图函数会查询调色板映射表以把像素值从逻辑调色板的索引转换成系统调色板的索引,这样当像素被输出到视频内存中时就具有了正确的颜色值。
图11.2说明了这种映射关系,从图中读者可以体会到逻辑调色板的缓冲作用。
在该图中,GDI绘图函数使用逻辑调色板的索引1中的颜色来绘图,通过查询调色板映射表,得知系统调色板中的第23号索引与其完全匹配,这样实际输出到视频内存中的像素值是23。
注意图中还演示了颜色的不完全匹配,即逻辑调色板中的索引15和系统调色板中的索引46。
每个要使用额外颜色的窗口都会实现自己的逻辑调色板,逻辑调色板中的每种颜色在系统调色板中都有相同或相近的匹配。
调色板的实现优先权越高,匹配的精度也就越高。
Windows规定,活动窗口的逻辑调色板(如果有的话)具有最高的实现优先权。
这是因为活动窗口是当前与用户交互的窗口,应该保证其有最佳的颜色显示。
非活动窗口的优先权是按Z 顺序自上到下确定的(Z顺序就是重叠窗口的重叠顺序)。
活动窗口有权将其逻辑调色板作为前景调色板实现,非活动窗口则只能实现背景调色板。
提示:术语活动窗口(Active window)或前台窗口(Foreground window)是指当前与用户交互的窗口,活动窗口的顶端的标题条呈高亮显示,而非活动窗口的标题条则是灰色的。
活动窗口肯定是一个顶层窗口(Top-level window),顶层窗口是指没有父窗口或父窗口是桌面窗口的窗口,这种窗口一般都有标题和边框,主要包括框架窗口和对话框。
术语重叠窗口是指作为应用程序主窗口的窗口,我们可以把对话框看成是一种特殊的重叠式窗口。
图11.2 调色板的映射关系11.1.2 调色板的创建和实现MFC的CPalette类对逻辑调色板进行了封装。
该类的成员函数CreatePalette负责创建逻辑调色板,该函数的声明为:BOOL CreatePalette( LPLOGPALETTE lpLogPalette ); //成功则返回TRUE。
参数lpLogPalette是一个指向LPLOGPALETTE结构的指针,LPLOGPALETTE结构描述了逻辑调色板的内容,该结构的定义为:typedef struct tagLOGPALETTE {WORD palVersion; //Windows版本号,一般是0x300WORD palNumEntries; //调色板中颜色表项的数目PALETTEENTRY palPalEntry[1]; //每个表项的颜色和使用方法} LOGPALETTE;结构中最重要的成员是PALETTEENTRY数组,数组项的数目由palNumEntries成员指定。
PALETTEENTRY结构对调色板的某一个颜色表项进行了描述,该结构的定义为:typedef struct tagPALETTEENTRY {BYTE peRed; //红色的强度(0~255,下同)BYTE peGreen; //绿色的强度BYTE peBlue; //蓝色的强度BYTE peFlags;} PALETTEENTRY;成员peFlags说明了颜色表项的使用方法,在一般应用时为NULL,若读者对peFlags的详细说明感兴趣,可以查看Visual C++的联机帮助。