OpenGL中调色板的使用
OpenGL中调色板的使用
目 录 1 调色板的知识 2 颜色表示与转换 3 调色板的生成算法 4 设置调色板的例子
--------------------------------------------------------------------------------
OpenGL是由SGI公司开发的一套3D图形软件接口标准,由于具有体系结构简单合理、使用方便、与操作平台无关等优点,OpenGL迅速成为一种3D图形接口的工业标准,并陆续在各种平台上得以实现。微软公司在推出Windows NT 3.5时便开始把OpenGL集成到NT操作系统之中,96年下半年又在Windows 95OSR2中加入OpenGL,使得低端用户也能够充分享受到OpenGL带来的高质量3D图形效果。 基于OpenGL的应用程序有两种类型。一种是利用OpenGL辅助库来完成一些简单的图形显示,这种应用程序编写起来非常简单,但其功能十分有限,因此只适合于演示OpenGL函数的用法等任务。第二种是与VC++等这样功能强大的开发工具相结合,从而完成比较复杂的任务。本文所要讨论的就是以MFC类库为基础,使用OpenGL时所涉及到的关于调色板的问题。
1、Windows下的调色板 OpenGL可以使用16色、256色、64K和16M真彩色。真彩模式下不需要调色板,而在16色模式下根本不可能得到较为满意的效果,因此对OpenGL而言,调色板只有在256色模式下才有意义。 我们知道,Windows把调色板分为系统调色板和逻辑调色板。每个应用程序都拥有一套自己的逻辑调色板(或使用缺省调色板),当该应用程序拥有键盘输入焦点时可以最多使用从16M种色彩中选取的256种颜色(20种系统保留颜色和236种自由选取的颜色),而失去焦点的应用程序可能会有某些颜色显示不正常。系统调色板由Windows内核来管理,它是由系统保留的20种颜色和经仲裁后各个应用程序设置的颜色组成,并与硬件的256个调色板相对应。应用程序的逻辑调色板与硬件的调色板没有直接的对应关系,而是按照最小误差的原则映射到系统调色板中,因此即使应用程序自由选取256种不同颜色构成自己的逻辑调色板,也有可能某些颜色显示到屏幕上时是一样的。 当应用程序的窗口接收到键盘输入焦点时,Windows会向它发送一条WM-QUERYNEWPALETTE消息,让它设置自己的逻辑调色板,此时Windows会在系统调色板中尽量多地加入该应用程序需要的颜色,并生成相应的映射关系。接着Windows会向系统中所有的覆盖型窗口和顶级窗口(包括拥有键盘输入焦点的窗口)发送一条WM-PALETTECHANGED消息,让它们设置逻辑调色板和重绘客户区,以便能更充分地利用系统调色板,已拥有键盘输入焦点的窗口不应再处理这条消息,以避免出现死循环。
2、OpenGL的颜色表示与转换 OpenGL内部用浮点数来表示和处理颜色,红绿蓝和Alpha值这四种成份每种的最大值为1.0,最小值为0.0。在256色模式下,OpenGL把一个象素颜色的内部值按线性关系转换为8比特(Bit)来输出到屏幕上,其中红色占最低位的3比特,绿色占中间的3比特,蓝色占最高位的2比特,Windows将这个8比特值看作逻辑调色板的索引值。例如OpenGL的颜色值(1.0、0.14、0.6667)经过转换后二进制值为(红色为111、绿色为001、蓝色为10),即第143号调色板,该调色板指定的颜色的RGB值应与(1.0、0.14、0.6667)有相同的比率,为(255、36、170),如果不是该值,那么显示出来的颜色就会有误差。
3、调色板的生成算法 很明显,OpenGL输出的8比特值中直接表明了颜色的组成,为了使图形显示正常,我们应以线性关系来设置逻辑调色板,使其索引值直接表明颜色的组成。因此生成调色板时,把索引值从低位到高位分成3-3-2共三个部分,将每一部分映射到0 — 255中去,这样3比特映射为{0、36、73、109、146、182、219、255},2比特映射为{0、85、170、255},最后把三部分组合起来成为一种颜色。 经过上面的处理后,256种颜色均匀分布在颜色空间中,并没有完全包含系统保留的20种颜色(只包含了7种),这意味着将会有数种颜色显示成一样,从而影响效果。一个较好的解决办法是按照最小均方误差的原则把13种系统颜色纳入到逻辑调色板中,具体的对应关系请参见后面的例子。 从原理上来说,并非一定要使用线性映射,还可以用其它一些映射关系,如加入Gamma校正以便更能符合人眼的视觉特性,不过这些映射关系应用得并不广泛,在此不再讨论。
4、MFC应用程序中设置调色板的例子 下面以一个简单的MFC应用程序为例来说明设置调色板的方法,使用的开发工具为Visual C++ 5.0。 1)使用AppWizard生成一个拥有缺省选项的应用程序Sample,并在“Project//Settings...//Link”属性页中添加库模块:“opengl32.lib、glu32.lib、glaux.lib”。 2)利用ClassWizard为CMainFrame添加处理WM-QUERYNEWPALETTE和WM-PALETTECHANGED两条消息的函数,并在函数体添加如下内容:
void CMainFrame::OnPaletteChanged(CWnd *pFocusWnd) { CView *pView=GetActiveView(); // 取得活动的视 // 把消息传递给活动视的消息处理函数 if (pView) pView-&SendMessage(WM-PALETTECHANGED,(WPARAM)(pFocusWnd-&GetSafeHwnd()),(LPARAM)0); }
BOOL CMainFrame::OnQueryNewPalette() { CView *pView=GetActiveView(); if (pView) return pView-&SendMessage(WM-QUERYNEWPALETTE,(WPARAM)0,(LPARAM)0); return FALSE; }
3)利用ClassWizard为CSampleView加入处理WM-QUERYNEWPALETTE和WM-PALETTECHANGED两条消息的函数,其中内容如下:
voidCSampleView::OnPaletteChanged(CWnd *pFocusWnd) { // 如果自己拥有输入焦点,那么不处理这条消息 if (pFocusWnd!=this) OnQueryNewPalette(); }
BOOLCSampleView::OnQueryNewPalette() { if (m-pPal) { CDC *pDC=GetDC(); CPalette *pOldPal=pDC-&SelectPalette(m-pPal,FALSE); UINTu=pDC-&RealizePalette(); ReleaseDC(pDC); // 某些颜色改变了,需要重画客户区 if (u!=0) InvalidateRect(NULL,TRUE); } returnTRUE; }
4)在SampleView.h中添加下列公有成员变量和函数的声明:
CPalette *m-pP HGLRC m- static unsignedcharm-oneto8[2]; static unsignedcharm-twoto8[4]; // 2比特转换数组 static unsignedcharm-threeto8[8]; // 3比特转换数组 static intm-defaultOverride[13]; // 需处理的13种系统保留颜色 static PALETTEENTRYm-defaultPalEntry[20]; // 系统保留颜色
BOOL CreateRGBPalette(HDC hDC); unsigned char ComponentFromIndex(inti,UINTnbits,UINTshift);
并在SampleView.cpp中加入下列代码:
unsigned char CSampleView::m-threeto8[8]={ 0,2&&1,4&&1,6&&1, 0377 }; unsigned char CSampleView::m-twoto8[4]={ 0,0x55,0xaa,0xff}; unsigned char CSampleView::m-oneto8[2]={ 0,255};
// 按最小均方误差计算出的需用系统保留颜色替换的索引号 int CSampleView::m-defaultOverride[13]={ 0,3,24,27,64,67,88,173,181,236,247,164,91};
// 20种系统保留颜色值 PALETTEENTRY CSampleView::m-defaultp alEntu[20]={ {0,0, 0, 0,},{0x80, 0, 0, 0},{0, 0x80,0, 0}, {0x80,0x80,0, 0},{0,0, 0x80, 0},{ 0x80, 0, 0x80, 0}, { 0, 0x80, 0x80,0},{0xC0,0xC0,0xC0,0},{192,220,192,0} {166,202,240,0},{255,251,240,0},{160,160,164,0} {0x80,0x80,0x80, 0},{0xFF,0,0,0},{0xFF,0, 0xFF,} {0, 0xFF,0xFF,O},{0xFF,0xFF,0xFF,0} };
unsigned char CSampleView::ComponentFromlndex(int i,UINT nbits, UINT shift) { val=(unsigned char)(i&&shift); switch (nbits) { case 1:val&=0x1; return m-oneto8[val] case 2:val&=0x3; return m-twoto8[val] case 3:val&=0x7; return m-threeto8[val]; default:return 0; } }
BOOL CSampleView::CreateRGBPalette(HDC hDC) { PIXELFORMATDESCRIPTOR int n=GetPixelFormat(hDC); DescribepixxelFornt(hDC, n, sizeof(PIXELFORMATDESCRIPTOR),&pfd);
// 判断是否需要调色板,真彩模式下不需要 if (!(pfd.dwflags &PFD-NEED-PALETTE)) return FALSE;
LOGPALETTE*pPAL=(LOGPALETTE*)malloc(sizeof(logpalette)+256*sizeof(PALETTEENTRY)); if (!pPal) return FALSE; // 内存不足返回
pPal-&palVersion=0x300; pPal-&palNumEntries=256; // 逻辑调色板数量 n=1& for(int i =0; i&n; i++) { pPal-&palPalEnty[i].peRed= ComponentFromlndex(i,pfd.cRedBits,pfd.cRedShift); pPal-&palPalEnty[i].peGreen= ComponentFromlndex(i,pfd.cCREENbits,pfd.cGreenShift); pPal-&palPalEnty[i].peBlue= ComponentFromlndex(i,pfd.cBlueBits,pfd.cBlueShift); pPal-&palPalEntry[i].peFlags=0; }
// 插入13种系统保留颜色 if ((pfd.cColorBits==8)&& (pfd.cRedBits==3)&&(pfd.cRedShift==0)&& (pfd.cCreenBits==3)&&(pfd.cCreenBits==3)&& (pfd.cBlueBits==2)&&(pfd.cBlueBits==6)) { for (int j=1; j&=12; j++) pPal-&palPalEntry[m-defaulrOverride[j]]=m-default-palEntry[j]; }
if(m-pPal) delete m-pP m-pPal=new CP BOOL bResult =m-pPal-&CreatePalette(pPal); free(pPal); return bR }
5)修改CSamplsView::OnCreate()函数:
int CSample View::OnCreate(lpCreateStruct)==-1) return -1; CClientDC dc(this);
// 填充象素格式描述符,请参考联机帮助 PLXELFORMATDESCRIPTOR; memset (&pfd ,0,sixeof(PLXELFORMATDESCRIPTOR)); pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion =1; pfd.dwflags=PFD=DOUBLEBUFFER|PFD-SUPPORT-OPENGL|PFD-DRAW-TO-WINDOW; pfd.ipixlType=PFD-TYPE-RGBA; pfd.cColorBits=24; pfd.cColorBits=32; pfd.iLayerType=PED-MAIN-PLANE;
int nPixlformat=ChoosePixelFormat(dc.m-hDC,nPixelFormat,&pfd); if (!bResult) return -1;
// 创建rendering context. m-hrc=wglCreateContext(dc,m-hDC); if(!m-hrc) return -1;
// 创建逻辑调色板 CreateRGBPalette(dc.m-hDC); return 0;
此外还要修改OnSize、OnDraw和preCreateWindow等函数,此处不再述,读者可以从联机帮助中找到。
本分类共有文章10篇,更多信息详见
& 2012 - 2016 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";当前位置:
&使用通道调色板
使用通道调色板
文章来源:&& 责任编辑:圆圆yy &&时间: 09:00:04 &&&&
利用通道调色板,能够很方便地对通道进行编辑修改操作。
(1) 打开一个RGB或CMYK模式图像。
(2) 执行Window&Show Channels命令,以调出通道调色板(图3)。
①标题条:拖动标题条可以将通道调色板移到屏幕上的任一位置;
②舒卷按钮:单击舒卷按钮可以收缩或展开通道调色板。在需要的时候将调色板展开,不需要的时候再将它&卷起&,这样能有效地节约拥挤的屏幕资源;
③关闭按钮:单击关闭按钮可以隐含通道调色板;
④显示图标:显示图标为一眼睛图标,当一个通道前显示眼睛图标时,表示该通道是可见的,反之,当单击显示图标使眼睛消失时,则该通道被隐含起来,如果需要再一次调用,可执行Window&Show
Channels命令即可;
⑤通道略图图标:这个图标显示各个通道颜色的亮度值略图;
⑥通道名称:显示通道的名称;
⑦工具图标:在通道调色板的底部共有四个工具图标。单击第一个工具可在当前图像上调用一个颜色通道的灰度值并将其转换为选取区域;如果当前图像上已有选取区域,则第二个工具为可激活状态,单击这个工具可将这个选取区域保存到一个Alpha通道中;单击第三个工具将在当前图像中创建一个新的Alpha通道;第四个工具为垃圾桶图标,当把一个通道拖放到垃圾桶里时,这个通道将被删除;
⑧滚动条:一个图像,除了缺省的颜色通道外,我们还可以创建24个Alpha通道,当通道调色板不能全部显示时,可拖动滚动条来浏览;
⑨弹出式菜单:单击右上角的三角按钮,将出现一个弹出式菜单,菜单里提供了一些通道操作命令,如:New Channels(创建新通道)、Duplicate
Channels(复制通道)、Delete Channels(删除通道)等。
官方微博:
官方微信:想在手机上获取最新鲜资讯吗?添加全影网官方微信:www7192com
上一篇:下一篇:
免责声明:本站部分内容、观点、图片、文字、视频来自网络,仅供大家学习和交流,真实性、完整性、及时性本站不作任何保证或承诺。如果本站有涉及侵犯您的版权、著作权、肖像权的内容,请联系我们(),我们会立即审核并处理。
当前已有个参与
都说钻石是女人最好的朋友,在今天这样一个特殊的日子里,秀恩
一胖毁所有,所以人一旦瘦下来,完全就是脱胎换骨。身材对一个
&otherstories宣传照 不知是不是受极简风盛行的影响,现在大
客服热线: 咨询热线:400-
版权所有:潍坊全影网络有限公司 传真: 邮箱:备案号:鲁ICP备号 公安部备案号:13 Copyright &
版权所有 不得转载
扫描访问手机版共找到181个相关产品>
报价:4.00元
品牌/型号:艺客
分类:调色用品
报价:4.00元
品牌/型号:conzn
分类:调色用品
[浙江金华]&
报价:2.00元
品牌/型号:三年二班
分类:调色用品
报价:5.50元
品牌/型号:GLY
分类:调色用品
报价:9.00元
品牌/型号:外贸
分类:调色用品
报价:10.00元
品牌/型号:马利
分类:调色用品
报价:面议
品牌/型号:美第琦
分类:调色用品
[浙江金华]&
报价:5.80元
品牌/型号:博格利诺
分类:其他美术用品
[黑龙江哈尔滨]&
报价:4.20元
品牌/型号:25格
分类:调色用品
报价:7.90元
品牌/型号:双丰
分类:调色用品
报价:5.50元
品牌/型号:柏伦斯
分类:调色用品
[广东深圳]&
报价:5.50元
品牌/型号:36格软盖《方底 》
分类:调色用品
[甘肃甘南藏族自治州]&
报价:面议
品牌/型号:qubo
分类:调色用品
报价:12.00元
品牌/型号:荣大/HC119
分类:画夹、画板、画架
报价:5.00元
品牌/型号:马格利特
分类:调色用品
报价:13.00元
品牌/型号:飘香阁
分类:调色用品
[浙江绍兴]&
报价:13.00元
品牌/型号:自创
分类:调色用品
报价:面议
品牌/型号:瑞达
分类:调色用品
报价:3.80元
品牌/型号:劳尔Looer
分类:调色用品
报价:260.00元
品牌/型号:中盛
分类:画夹、画板、画架
油画调色板您可能感兴趣的产品
马可波罗网为您找到关于油画调色板的结果有181条,页面包含的信息数据有:油画调色板价格、油画调色板批发、油画调色板采购、油画调色板图片还有产品的详细参数,实时报价,价格行情,优质批发/供应等信息
按排行字母分类: