HSL和RGB的相互转换

void RGB2HSL(LONG cr, double &H, double &S, double &L)
{
	double R, G, B, Max, Min, DelMax;
	byte *pTemp = (byte *)&cr;

	R = (double)*pTemp / 255.0;
	G = (double)*(pTemp + 1) / 255.0;
	B = (double)*(pTemp + 2) / 255.0;

	Min = min(R, min(G, B));
	Max = max(R, max(G, B));
	DelMax = Max - Min;

	L = (Max + Min) / 2.0;

	if (Max == Min)
	{
		H = 0;
		S = 0;
	}
	else
	{
		if (Max == R)
			H = (G - B) / DelMax / 6.0;
		else if(Max == G)
			H = (B - R) / DelMax / 6.0 + 1.0 / 3.0;
		else if (Max == B)
			H = (R - G) / DelMax / 6.0 + 2.0 / 3.0;

		if (H < 0)
			H += 1.0;

		if (L > 0.5)
			S = DelMax / (2 - Max - Min);
		else
			S = DelMax / (Max + Min);
	}
}

double Hue2RGB(double v1, double v2, double vH)
{
	if (vH < 0) vH += 1.0;
	if (vH > 1) vH -= 1.0;
	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 HSL2RGB(double H, double S, double L, ULONG& cr)
{
	double R, G, B;
	double Max, Min, DelMax;

	if (S == 0)
	{
		R = L;
		G = L;
		B = L;
	}
	else
	{
		if (L <= 0.5)
			Max = L * (1 + S);
		else
			Max = L + S - L * S;
		Min = 2 * L - Max;
		DelMax = Max - Min;

		R = Hue2RGB(Min, Max, H + (1.0 / 3.0));
		G = Hue2RGB(Min, Max, H);
		B = Hue2RGB(Min, Max, H - (1.0 / 3.0));
	}
	byte *pTemp = (byte *)&cr;

	*pTemp = R * 255;
	*(pTemp + 1) = G * 255;
	*(pTemp + 2) = B * 255;
}
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值