欢迎来到天天文库
浏览记录
ID:39827664
大小:30.51 KB
页数:3页
时间:2019-07-12
《将RGB值转换为灰度值的简单算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、将RGB值转换为灰度值的简单算法 使场景或精灵以灰度的形式显示,这是一般游戏制作中常常用到的效果,如:战棋游戏中当一个角色被使用过后,通常就会变成灰色,代表本回合已不能行动了;《仙剑》中回忆彩蝶的部分是用整屏的灰色来表现的?(记的不太清楚,太久了^_^);还有很多很多例子…… 将RGB值转换为灰度的过程应该是在程序中实现的(至少我是这么认为的)。其实这是非常简单的,基本原理就是将一个点的RGB值分开来求和,然后除以3,把得到的值再分别付给RGB,用公式表示如下:R=G=B=0.3R+0.6G+0.1B;//第二版改正后的公式//第一版中的错误公式是 R=G=B=(R+G+B)/
2、3; 在实际编程应用中又可分为8位、16位和24位三种情况,下面进行一一介绍: 一、首先说最简单的24位点的转换,24位点的RGB均匀分布,所以分离和合成都较为简单,代码如下://=======24位转换============intgMask=0x00ff00;//绿色掩码intbMask=0x0000ff;//兰色掩码intRGB24toGray(intsour){ intr,g,b,t;//临时变量 r=(sour>>16); g=(sour&gMask)>>8; b=sour&bMask; t=(r*3+g*6+b)/10;//第二版改正的地方
3、return(t<<16)
4、(t<<8)
5、t;} 二、16位点的转换要麻烦一些,因其涉及到555和565两种色码格式,所以在转换前需要我们进行一些初始工作://=======16位转换============BYTERMove,GMove;//R和G移动到最低位需要的步数//初始化数据,本函数在游戏初始时执行,仅执行一次voidInit(){ if(Is555)//555模式0rrrrrgggggbbbbb { RMove=10; GMove=5; } else//565模式rrrrrggggggbbbbb { RMove=
6、11; GMove=6; /*注意:为什么这里GMove=6,因为565模式下G值有6位,如果用一个6位值和两个5位值相加除以3,得到的结果可能使5位溢出,所以我们要多移动一位即除以2*/ }}//16位点转换WORDRGB16toGray(WORDsour){ WORDt; WORDr,g,b; r=sour>>RMove; g=(GMask&sour)>>GMove; b=BMask&sour; t=(r*3+b*6+g)/10;//第二版改正的地方 return(t<7、(t<8、t;} 三、89、位点的转换和上面两种有比较大的差异,因为它的颜色是由调色板决定的,我们只有通过改变调色板来进行转换,先用lpDDPal->GetEntries()获得调色板,然后分别转换需要的调色板值,完成后用lpDDPal->SetEntries()更新即可,程序如下://===========8位转换(注:本函数只适用于全屏转换)===========voidRGB8_to_Gray(){ intt;//临时变量 LPPALETTEENTRYPal=(LPPALETTEENTRY)LocalAlloc(LPTR,sizeof(PALETTEENTRY)*256); //获取调色板 10、 lpDDPal->GetEntries(0,0,256,Pal); //转换 for(inti=0;i<256;i++) { t=(Pal[i].peRed*3+Pal[i].peGreen*6+Pal[i].peBlue)/10;//第二版改正的地方 Pal[i].peRed=Pal[i].peGreen=Pal[i].peBlue=t; } //更新调色板 lpDDPal->SetEntries(0,0,256,Pe);}
7、(t<8、t;} 三、89、位点的转换和上面两种有比较大的差异,因为它的颜色是由调色板决定的,我们只有通过改变调色板来进行转换,先用lpDDPal->GetEntries()获得调色板,然后分别转换需要的调色板值,完成后用lpDDPal->SetEntries()更新即可,程序如下://===========8位转换(注:本函数只适用于全屏转换)===========voidRGB8_to_Gray(){ intt;//临时变量 LPPALETTEENTRYPal=(LPPALETTEENTRY)LocalAlloc(LPTR,sizeof(PALETTEENTRY)*256); //获取调色板 10、 lpDDPal->GetEntries(0,0,256,Pal); //转换 for(inti=0;i<256;i++) { t=(Pal[i].peRed*3+Pal[i].peGreen*6+Pal[i].peBlue)/10;//第二版改正的地方 Pal[i].peRed=Pal[i].peGreen=Pal[i].peBlue=t; } //更新调色板 lpDDPal->SetEntries(0,0,256,Pe);}
8、t;} 三、8
9、位点的转换和上面两种有比较大的差异,因为它的颜色是由调色板决定的,我们只有通过改变调色板来进行转换,先用lpDDPal->GetEntries()获得调色板,然后分别转换需要的调色板值,完成后用lpDDPal->SetEntries()更新即可,程序如下://===========8位转换(注:本函数只适用于全屏转换)===========voidRGB8_to_Gray(){ intt;//临时变量 LPPALETTEENTRYPal=(LPPALETTEENTRY)LocalAlloc(LPTR,sizeof(PALETTEENTRY)*256); //获取调色板
10、 lpDDPal->GetEntries(0,0,256,Pal); //转换 for(inti=0;i<256;i++) { t=(Pal[i].peRed*3+Pal[i].peGreen*6+Pal[i].peBlue)/10;//第二版改正的地方 Pal[i].peRed=Pal[i].peGreen=Pal[i].peBlue=t; } //更新调色板 lpDDPal->SetEntries(0,0,256,Pe);}
此文档下载收益归作者所有