RGB转换为HSL的算法一般需要自己编写,但是在C++Builder中可以利用FireMonkey的函数实现RGB与HSL之间的转换。
下面是利用FireMonkey的RGBtoHSL和HSLtoRGB函数(需要注意的是函数参数H、S、L都是0-1之间的数据,所以显示的色相H、饱和度S、亮度L都要经过转换)实现的4个函数的代码:
#include <System.UIConsts.hpp>// ---------------------------------------------------------------------------
// 把TAlphaColor转换为HSL
void __fastcall AlphaColorToHSL(TAlphaColor aColor, float &fH, float &fS, float &fL)
{// void __fastcall RGBtoHSL(System::Uitypes::TAlphaColor RGB, float &H, float &S, float &L);RGBtoHSL(aColor, fH, fS, fL);fH = fH * 360.0; // 其值在0-1.0之间,所以要转换fS = fS * 100.0; // 其值在0-1.0之间,所以要转换fL = fL * 100.0; // 其值在0-1.0之间,所以要转换
}// ---------------------------------------------------------------------------
// 把TAlphaColor转换为字符串HSL
void __fastcall AlphaColorToHSL(TAlphaColor aColor, AnsiString &Hstr, AnsiString &Sstr, AnsiString &Lstr)
{float fH, fS, fL;// 把TAlphaColor转换为HSLAlphaColorToHSL(aColor, fH, fS, fL);Hstr = FloatToStrF(fH, ffFixed, 15, 2);Sstr = FloatToStrF(fS, ffFixed, 15, 2);Lstr = FloatToStrF(fL, ffFixed, 15, 2);
}// ---------------------------------------------------------------------------
// 把HSL转换为TAlphaColor
TAlphaColor __fastcall HSLToAlphaColor(float &fH, float &fS, float &fL)
{TAlphaColor aColor;// 判断在合适的范围内if (fH < 0.0)fH = 0.0;if (fH > 360.0)fH = 360.0;if (fS < 0.0)fS = 0.0;if (fS > 100.0)fS = 100.0;if (fL < 0.0)fL = 0.0;if (fL > 100.0)fL = 100.0;fH = fH / 360.0; // 其值在0-1.0之间,所以要转换fS = fS / 100.0; // 其值在0-1.0之间,所以要转换fL = fL / 100.0; // 其值在0-1.0之间,所以要转换// System::Uitypes::TAlphaColor __fastcall HSLtoRGB(float H, float S, float L);aColor = HSLtoRGB(fH, fS, fL);return aColor;
}// ---------------------------------------------------------------------------
// 把字符串HSL转换为TAlphaColor
TAlphaColor __fastcall HSLToAlphaColor(AnsiString &Hstr, AnsiString &Sstr, AnsiString &Lstr)
{float fH, fS, fL;TAlphaColor aColor;// 判断是否为数字,不是返回0fH = StrToFloatDef(Hstr, 0);fS = StrToFloatDef(Sstr, 0);fL = StrToFloatDef(Lstr, 0);// 把HSL转换为TAlphaColor aColor = HSLToAlphaColor(fH, fS, fL);Hstr = FloatToStrF(fH, ffFixed, 15, 2);Sstr = FloatToStrF(fS, ffFixed, 15, 2);Lstr = FloatToStrF(fL, ffFixed, 15, 2);return aColor;
}
// ---------------------------------------------------------------------------