Chinaunix首页 | 论坛 | 博客
  • 博客访问: 257135
  • 博文数量: 71
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-16 13:07
个人简介

我喜欢蓝天,也喜欢雨天。

文章分类

全部博文(71)

文章存档

2014年(14)

2013年(57)

分类: Windows平台

2013-08-16 15:31:21

 

概念理解:

1.有一个长宽各为200个象素,颜色数为16色的彩色图,每一个象素都用R、G、B三个分量表示。因为每个分量有256个级别,要用8位(bit),即一个字节(byte)来表示,所以每个象素需要用3个字节。整个图象要用200×200×3,约120k字节,可不是一个小数目呀!

如果我们用下面的方法,就能省的多。因为是一个16色图,也就是说这幅图中最多只有16种颜色,我们可以用一个表:表中的每一行记录一种颜色的R、G、B值。这样当我们表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个象素为红色时,只需要标明0即可。让我们再来计算一下:16种状态可以用4位(bit)表示,所以一个象素要用半个字节。整个图象要用200×200×0.5,约20k字节,再加上表占用的字节为3×16=48字节.整个占用的字节数约为前面的1/6,省很多吧?

这张R、G、B的表,就是我们常说的调色板(Palette),另一种叫法是颜色查找表LUT(Look Up Table),似乎更确切一些。

windows保留了20种“静态”颜色,允许应用程序修改其余的236种。

2.光栅操作就是在像素位上逐位进行操作。

3.在win os中存在三种调色板:硬件调色板,逻辑调色板,系统调色板,,winos用"调色板管理器"机制来管理调色板,调色板存在于一个位图文件中,一个窗体的DC中,,或OS中,,

硬件调色板就是显卡适配器所能实际表达的颜色深度,

逻辑调色板就是winos通过调色板管理机制为每个窗体应用程序DC分配的调色板(系统调色板只有一个,而逻辑调色板可以有多个,,它的本质就是一块内存中的区域用于描述当前应用使用到的调色板,我们都知道调色板是一个结构),所以逻辑调色板的用途在于模拟硬件调色板,,以使windows作为一个os可以为界面显示,图像显示等应用提供它们各自专用的活动的调色板,当逻辑调色板色深小于或大小硬件调色板时,winos通过调色板管理机制自动让二者谐和,

系统调色板就是winos当前正在使用到的调色板,逻辑调色板可以通过调色板管理机制转变为当前系统调色板,但是不管winos的调色板管理机制如何,最终的调色板都要靠硬件调色板来实现。

4.调色板实现动画:使用不同的颜色在屏幕上绘制图形,然后改变调色板中的颜色,这时图形中所有对象立即改变颜色,就好像它们在位置上重新悔之晚矣样,这样将颜色序列化就可以制造出动画效果,不许重新绘制每一幅画面,因而显示速度非常快。

5.程序能将DIB文件减去前14个字节加载到连续的内存块中形成“紧缩DIB(packed-DIB)格式的位图”。程序可以使用紧缩DIB格式,通过Windows剪帖板来交换图像或创建画刷,也或完全访问DIB的内容,并以任意方式修改DIB。

 

常用函数:

hPalette = CreatePalette(plp)创建逻辑调色板.  static HPALETTE hPalette; LOGPALTTE * plp;

SelectPalette(hdc,hPalette,FALSE);将逻辑调色板选进设备描述表。

RealizePalette(hdc);使windows在设备描述表中“实现”逻辑调色板。

windows 调色板管理器需要包括两个发送给主窗口的消息:QM_QUERYNEWPALETTE,当主窗口活动时,该消息发送给主窗口;当系统调色板改成与WM_QUERYNEWPALETTE消息相同时,windows将WM_QUERYNEWPALETTE消息发送给当前活动的窗口,来启动并终止处理窗口链的所有主窗口。

GetDeviceCaps(hdc,SIZEPALETTE);返回在显示卡上的调色板表的尺寸,与同时显示的颜色总数相同。

GetDeviceCaps(hdc,NUMRESERVED);返回调色板表的颜色数,该表是设备驱动程序为系统保留的,此值是20.

GetDeviceCaps(hdc,COLORRES);告诉加载到硬件调色板表的RGB颜色值分辨率(以位为单位).

GetSystemPaletteEntries(hdc,uStart,uNUM,&pe);获取系统调色板中的某些或全部条目。

GetPaletteEntries(hPalette,uStart,uNum,&pe);查询逻辑调色板中的RGB颜色值。

SetPaletteEntries(hPalette,uStart,uNum,&pe);创建逻辑调色板后,允许改变其中的值的相应函数。但此函数不引起系统调色板的任何变化,即使当前调色板选进设备描述表。也不改变逻辑调色板尺寸,可用ResizePalette改变。

ilndex = GetNearestPalette(hPalette,cr);接受RGB颜色引用值作为最后参数,并将索引返回给逻辑调色板,该逻辑调色板与和它最接近的RGB颜色值相对应。

阅读(1738) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~