当前位置: 首页 > 编程语言 > C#

RGB转HSL及返回,计算题分享

时间:2023-04-10 19:53:54 C#

RGB转HSL及返回,计算题我正在尝试将RGB转HSL,我也想将HSL转RGB,我已经为它写了一个类但是如果我执行RGB->HSL->RGB来尝试它是否有效,我会得到不同的值。示例情况:如果您通过执行HSLColorMyTestConversion=HSLColor.FromRGB(Colors.Green)创建一个HSLColor对象;然后执行ColorExpectedGreenHere=MyTestConversion.ToRGB()您会得到与Colors不同的颜色。绿色是原始输入,所以出了点问题。这是我正在使用的代码:publicclassHSLColor{publicfloatHue;公共浮动饱和;公共浮动亮度;publicHSLColor(floatH,floatS,floatL){Hue=H;饱和度=S;光度=L;}publicstaticHSLColorFromRGB(ColorClr){returnFromRGB(Clr.R,Clr.G,Clr.B);}publicstaticHSLColorFromRGB(字节R,字节G,字节B){float_R=(R/255f);浮动_G=(G/255f);浮动_B=(B/255f);浮动_Min=Math.Min(Math.Min(_R,_G),_B);浮动_Max=Math.Max(Math.Max(_R,_G),_B);浮动_Delta=_Max-_Min;浮动H=0;浮动S=0;浮动L=(浮动)((_Max+_Min)/2.0f);if(_Delta!=0){if(L<0.5f){S=(float)(_Delta/(_Max+_Min));}else{S=(float)(_Delta/(2.0f-_Max-_Min));}漂浮_Delta_R=(浮动)(((_Max-_R)/6.0f+(_Delta/2.0f))/_Delta);浮动_Delta_G=(浮动)(((_Max-_G)/6.0f+(_Delta/2.0f))/_Delta);浮动_Delta_B=(浮动)(((_Max-_B)/6.0f+(_Delta/2.0f))/_Delta);如果(_R==_Max){H=_Delta_B-_Delta_G;}elseif(_G==_Max){H=(1.0f/3.0f)+_Delta_R-_Delta_B;}elseif(_B==_Max){H=(2.0f/3.0f)+_Delta_G-_Delta_R;}如果(H1)H-=1.0f;}返回新的HSLColor(H,S,L);}privatefloatHue_2_RGB(floatv1,floatv2,floatvH){if(vH1)vH-=1;如果((6*vH)<1)返回(v1+(v2-v1)*6*vH);如果((2*vH)<1)返回(v2);如果((3*vH)<2)返回(v1+(v2-v1)*((2/3)-vH)*6);返回(v1);}publicColorToRGB(){ColorClr=newColor();浮动var_1,var_2;if(Saturation==0){Clr.R=(Byte)(Luminosity*255);Clr.G=(Byte)(Luminosity*255);Clr.B=(Byte)(Luminosity*255);}else{if(Luminosity<0.5)var_2=Luminosity*(1+Saturation);elsevar_2=(亮度+饱和度)-(饱和度*亮度);var_1=2*亮度-var_2;Clr.R=(Byte)(255*Hue_2_RGB(var_1,var_2,Hue+(1/3)));Clr.G=(Byte)(255*Hue_2_RGB(var_1,var_2,Hue));Clr.B=(Byte)(255*Hue_2_RGB(var_1,var_2,Hue-(1/3)));}返回Clr;}}用法参考:EasyRGBColorMath除了精度问题,我认为你的实际算法是不正确的。这应该是您的FromRGB:publicstaticHSLColorFromRGB(ByteR,ByteG,ByteB){float_R=(R/255f);浮动_G=(G/255f);浮动_B=(B/255f);浮动_Min=Math.Min(Math.Min(_R,_G),_B);float_Max=Math.Max(Math.Max(_R,_G),_B);浮动_Delta=_Max-_Min;浮动H=0;浮动S=0;浮动L=(浮动)((_Max+_Min)/2.0f);if(_Delta!=0){if(L接下来需要理解的是,我们取0到255的整数RGB值,然后将它们转换为0到1的十进制值。这样我们得到的HSL需要转换成正常的度数/百分比/任何你习惯的百分比。返回的H值应该是从0到6,所以要将它转换成度数,你只需乘以60。H实际上可以是负数,所以如果它只是add360;//转换为度数H=H*60f;if(HS和L也需要乘以100以获得0到100之间的百分比UPDATE这段代码会让你从HSL到RGB.它假设HSL值仍然是十进制格式。此外,为了提高精度,我在下面的代码中使用了double而不是float。publicColorToRGB(){byter,g,b;if(Saturation==0){r=(byte)Math.Round(Luminosity*255d);g=(byte)Math.Round(Luminosity*255d);b=(byte)Math.Round(Luminosity*255d);}else{双t1,t2;双th=色调/6.0d;如果(亮度1)c-=1d;if(6.0d*cCommonbug.你有publicstaticHSLColorFromRGB(ByteR,ByteG,ByteB){float_R=(R/255);float_G=(G/255);float_B=(B/255);准确地告诉我哪些R值可以导致_R不为0。(提示:只有一个)。编辑:你有1/3的问题在ToRGB()中。我在你的代码中看到的问题如下:float_R=(R/255);你基本上在这里做整数除法,所以你失去了很多精度。尝试将其更改为:float_R=(R/255f);(与其他2lines)。另外,为了进一步提高精度,最好使用double而不是float。以上就是C#学习教程的全部内容:RGB转HSL并返回,计算问题分享。网络集合不代表一个位置。如果涉及侵权,请点击维权联系管理员删除,如需转载请注明出处: