登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面包会有的

... ...

 
 
 

日志

 
 

调色板[经典]  

2011-02-05 00:53:08|  分类: VC++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Windows 系统在支持硬件调色板的时候,遇到了些困难。如果 Windows 系统允许任何一个程序改变视频硬件调色板中RGB 颜色的设置,那么在系统中运行的每一个应用程序都将受影响。例如硬件调色板中的黑色被改为蓝色,那么每一个窗口中的所有黑色像素立即就会被改为蓝色。这就违反了 Windows 应用程序作为独立窗口运行,彼此互不干扰的基本原则。另一个问题是 Windows 程序可以在任何系统运行,而大多数系统中显示的颜色和 Super VGA 系统中的颜色数量不同。
    为了解决上述问题,从3.0版开始Windows提供了一个调色板管理器,用作用户开发的应用程序和输出设备。
调色板管理器由系统调色板和逻辑调色板构成,它们用于管理实际设备的“硬件调色板”。系统调色板是相应于显示器的硬件调色板,它是一个有二十种保留颜色的数组,它的项数与显示器实际能显示的颜色数相等,这些保留颜色被用来绘制系统的菜单、按钮控制、屏幕桌面颜色和抖动的画刷等。
    一般情况下,这二十种保留颜色不能被改变。逻辑调色板是模拟显示卡中硬件调色板的一块内存区域,逻辑调色板中每一项包含一个TGB值,这个RGB值供应用程序创建彩色的画笔、字体、画刷和位图。当逻辑调色板包括的项比硬件设备实际支持的要多时,“扩充的”逻辑调色板就匹配硬件调色板的相近颜色,如果逻辑调色板所包括的项少于硬件调色板,硬件调色板中的一些颜色将不使用。
为了更加深入的了解Windows系统中的调色板,这里我们再来看一下调色板管理器的工作原理:
    如果Windows显示器处理的是24位彩色,调色板管理器没有太大意义,因为可以显示的颜色(约有一千六百万种)能表示DIB中所有颜色。即使显示器处理的只是3位或4位颜色,调色板管理器也没有什么用处,这时系统本身储存有20种系统颜色,已超过了设备能显示的颜色数组。只有对八位(256种颜色)彩色显示器,调色板管理器才真正起作用。为了使调色板管理正常工作,当Windows应用程序使用逻辑调色板时,首先必须检查显示驱动器是否支持逻辑调色板,然后根据需要创建一个逻辑调色板,在使用逻辑调色板之前还必须将其先安装到系统调色板上。具体过程如下:
1) 检查显示驱动程序是否支持逻辑调色板
if(GetDeviceCaps(hDC,DRIVERSION)==0x300)
{kk1}
}
else{kk1}
//不支持逻辑调色板
}
2)逻辑调色板的创建
首先根据Windows规定的逻辑调色板的格式,在内存中分配一块相应大小的区域。内存块的大小根据需要显示的颜色数所定。
typedefstructtagLOGPALETTE{kk1}
WORDpalVersion;
/*windows的版本号*/
WORDpalNumEntries;
/*调色板的项数*/
PALETTEENTRYpalPalEntry[1];
}LOGPALETTE;
typedefstructtagPALETTEENTRY{kk1}
BYTEpeRed;
BYTEpeGreen;
BYTEpeBlue;
BYTEpeFlags;
}PALETTEENTRY;
公式如下:
Sizeof(LOGPALETTE)*numcolor*Sizeof(PALETTEENTRY)
numcolor-----------显示的颜色数;
然后将Windows系统的版本号,及调色板要显示的颜色数填入LOGPALETTE结构中;再将所需要显示的颜色的RGB值依次填入PALETTEENTRY结构中。最后,利用Windows的API中的CreatePalette()函数创建一个调色板,并利用函数SelectPalette()把创建的调色板选入设备描述表。这样一个逻辑调色板就创建了。
 
(3)逻辑调色板映射到系统调色板
API中RealizePalette()函数可以使Windows的调色板管理器工作。RealizePalette()函数通知Windows调色板管理器真正地改变系统调色板,使其与设备描述表中的逻辑调色板相匹配并按要求映射颜色。这个映射过程不是简单的将逻辑调色板前面的颜色放入系统调色板二十中保留颜色之后,逻辑调色板中剩余的颜色就抛弃不管。它的映射规则如下:
如果逻辑调色板中某种颜色在系统调色板中已存在,该颜色将映射到系统调色板中相应颜色上。
如果逻辑调色板中某种颜色在系统调色板中无相应颜色,只要系统调色板有空间,该颜色就加到系统调色板上。
当系统调色板已满时,逻辑调色板中颜色映射到系统调色板中最相近的颜色上。根据以上规则映射就形成了Windows用来正确显示图象的调色板。
通常情况下,Windows系统保留二十种供所有窗口使用的系统颜色不能被改变,但是系统还是提供了函数SetSystemPaletteUse()允许应用程序去改变系统调色板,或者恢复正常状态。在使用一个16到64色的设备时,改变系统调色板是扩展颜色选择项的一种方法。对于64色以上的设备来说,具有足够的颜色。
因此,保留系统的颜色与增加需要的颜色并不矛盾。
(4)在退出程序前,释放逻辑调色板分配的内存,恢复原来的调色板,删除当前调色板。
LocalUnlock(hLocPal);
LocalFree(hLocPal);
SeletPalette(hDC,hOldPal,FALSE);
DeleteObject(hNewPal);
三、逻辑调色板冲突的解决方法
当几个程序都使用逻辑调色板的时候,Windows系统把当前优先级最高窗口的逻辑调色板送给系统调色板。非活动窗口的颜色取决于还有哪些颜色未被采用,这些非活动窗口首先使用系统调色板中剩余不用的项,然后才为那些无法得到原色的颜色使用调色板上相近的颜色。当要在同一窗口显示具有不同逻辑调色板的设备无关位图时,Windows系统就无法支持。我们解决这个问题的办法是:合并所有的逻辑调色板。当逻辑调色板的总项数不超过256时,合并操作只需将所有的逻辑调色板连接在一起;当总项数超过256时,可采用以下方法来合并逻辑调色板:
从不同逻辑调色板中选出最常用的颜色,组成一个256项逻辑调色板。
反复地合并不同逻辑调色板中相邻颜色并用其平均值来取它们。这样就把所有逻辑调色板简化成一个相似的256色逻辑调色板。


 

  评论这张
 
阅读(1015)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018