急!RGB(红绿兰)与ESL(色调,饱和度,亮度)如何转化?

wqpaul 2000-10-03 05:00:00
加精
...全文
2539 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqpaul 2000-12-13
  • 打赏
  • 举报
回复
原先开发的时候需要这样的一个算法,但后来没有最终用上。所以我也没认真的研究这个问题。
不过yefei,hanphy真心感谢你们,感谢CSDN.
yefei 2000-12-11
  • 打赏
  • 举报
回复
hanphy你错了,要不就是问题问错了,HSL(色调,饱和度,亮度)和HSV根本不是同一种。
大家可以参考《计算机真实感图形的算法基础》 科学出版社的最后一章。
这里有RGB和HLS的相互转换算法。可惜拿不到专家分了 wuwuwuwuwu......

#define undefined MAXINT
#define SmallValue 0.000001
RGBtoHLS(float R,G,B,*H,*L,*S )
{
float diff,Rdist,Gdist,Bdist;
float MaxValue = max(R,G,B);
float MinValue = min(R,G,B);
diff = MaxValue - MinValue;
*L=(MaxValue + MinValue)/2;
if( fabs(diff) < SmallValue )
{
*S=0;
*H=undefined;
}
else
{
if(L <= 0.5)
*S = diff/(MaxValue + MinValue);
else
*S = diff/(2- MaxValue - MinValue);
Rdist = (MaxValue-R)/diff;
Gdist = (MaxValue-G)/diff;
Bdist = (MaxValue-B)/diff;
if( R==MaxValue )
*H = Bdist-Gdist;
else
if(G==MaxValue)
*H=2+Rdist-Bdist;
else
if(B==MaxValue)
H = 4 +Gdist-Rdist;
H = H*60;
if (H<0)
H=H+360;
}
}

HLStoRGB(float H,L,S,*R,*G,*B)
{
float p1,p2,RGB();
if(L<0.5)
p2=L*(1+S);
p1=2*L-p2;
if(S==0)
{
*R=L;
*G=L;
*B=L;
}
else
{
*R=RGB(p1,p2,H+120);
*G=RGB(p1,p2,H);
*B=RGB(p1,p2,H-120);
}
}

float RGB(q1,q2,hue)
float q1,q2,hue;
{
if(hue>360)
hue=hue-360;
if(hue<0)
hue=hue+360;
if(hue<60)
Value=q1+(q2-q1)*hue/60;
else
if(hue<180)
Value=q2;
else
if(hue<240)
Value=q1+(q2-q1)*(240-hue)/60;
else
Value=q1;
return (Value);
}
yefei 2000-12-08
  • 打赏
  • 举报
回复
多谢了,一定把倒过来的算法也写下来啊,谢谢了。
hanphy 2000-10-06
  • 打赏
  • 举报
回复
wo kao!!!
我也忙,……
SCUM 2000-10-04
  • 打赏
  • 举报
回复
你问问别人书名吧,懒!
wqpaul 2000-10-04
  • 打赏
  • 举报
回复
多谢,多谢。麻烦您再敲一个HSV2RBG。我懒得逆推了。急。
hanphy 2000-10-03
  • 打赏
  • 举报
回复
哈哈,我有这样的程序,敲得我累死了……那去用吧:

#define mid(a,b,c) (a>=b&&a<=c)? a:(b>=a&&b<=c ? b:c))

void RGB2HSV(int nRed,int nGreen, int nBlue, int *nH,int *nS, int *nV)
{
int nLow,nMid,nHigh;

if(nRed==nGreen&&nGreen==nBlue){
*nH=0;
*nS==0;
*nV=nRed;
return ;
}

nLow=min( nRed,min(nGreen,nBlue));
nHigh=max(nRed,max(nGreen,nBlue));
nMid=mid(nRed,nGreen,nBlue);

*nV=(nLow+nHigh)/2;
*nS=nHigh-nLow;

int nCommon=(int)(60.0*(double)(nMid-nLow)/(double)(nHigh-nLow));

if(nRed==nLow&&nBlue==nHigh)
*nH=240-nCommon;
else if(nRed==nLow&&nGreen==nHigh)
*nH=120+nCommon;
else if(nGreen==nLow&&nRed==nHigh)
*nH=360-nCommon;
else if(nGreen==nLow&&nBlue==nHigh)
*nH=240-nCommon;
else if(nBlue==nLow&&nGreen==nHigh)
*nH=120-nCommon;
else if(nBlue==nLow&&nRed==nHigh)
*nH=nCommon;
}

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧