RGB与HSL、ESL转换

qt 实现的,windows以240为底


void RGB2HSL(QColor AColor, double &H, double &S, double &L)
{
	double R, G, B, Max, Min, del_R, del_G, del_B, del_Max;
	R = AColor.red() / 255.0;       
	G = AColor.green() / 255.0;
	B = AColor.blue() / 255.0;

	Min = qMin(R, qMin(G, B));    
	Max = qMax(R, qMax(G, B));    
	del_Max = Max - Min;        

	L = (Max + Min) / 2.0;

	if (del_Max == 0)           //This is a gray, no chroma...
	{
		//H = 2.0/3.0;          
		H = 0;                  
		S = 0;
	}
	else                        
	{
		if (L < 0.5) S = del_Max / (Max + Min);
		else         S = del_Max / (2 - Max - Min);

		del_R = (((Max - R) / 6.0) + (del_Max / 2.0)) / del_Max;
		del_G = (((Max - G) / 6.0) + (del_Max / 2.0)) / del_Max;
		del_B = (((Max - B) / 6.0) + (del_Max / 2.0)) / del_Max;

		if (R == Max) H = del_B - del_G;
		else if (G == Max) H = (1.0 / 3.0) + del_R - del_B;
		else if (B == Max) H = (2.0 / 3.0) + del_G - del_R;

		if (H < 0)  H += 1;
		if (H > 1)  H -= 1;
	}
}

QColor HSL2RGB(double H, double S, double L)
{
	double R, G, B;
	double var_1, var_2;
	if (S == 0)                       
	{
		R = L * 255.0;                
		G = L * 255.0;
		B = L * 255.0;
	}
	else
	{
		if (L < 0.5) var_2 = L * (1 + S);
		else         var_2 = (L + S) - (S * L);

		var_1 = 2.0 * L - var_2;

		R = 255.0 * Hue2RGB(var_1, var_2, H + (1.0 / 3.0));
		G = 255.0 * Hue2RGB(var_1, var_2, H);
		B = 255.0 * Hue2RGB(var_1, var_2, H - (1.0 / 3.0));
	}
	QColor retColor = QColor::fromRgb(R, G, B);
	return retColor;
}

double Hue2RGB(double v1, double v2, double vH)
{
	if (vH < 0) vH += 1;
	if (vH > 1) vH -= 1;
	if (6.0 * vH < 1) return v1 + (v2 - v1) * 6.0 * vH;
	if (2.0 * vH < 1) return v2;
	if (3.0 * vH < 2) return v1 + (v2 - v1) * ((2.0 / 3.0) - vH) * 6.0;
	return (v1);
}



void RGB2HSL(QColor AColor, int &H, int &S, int &L)
{
	double h, s, l;
	RGB2HSL(AColor, h, s, l);
	//H = RoundTo(h * 240, 0);
	//S = RoundTo(s * 240, 0);
	//L = RoundTo(l * 240, 0);
	H = qRound(h*240.0f);
	S = qRound(s*240.0f);
	L = qRound(l*240.0f);
}


QColor HSL2RGB(int H, int S, int L)
{
	double h, s, l;
	h = H / 240.0;
	s = S / 240.0;
	l = L / 240.0;
	return HSL2RGB(h, s, l);
}

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值