C# 将颜色反射率数据转换为L A B C和H值

C# 将颜色反射率数据转换为L A B C和H值,c#,colors,C#,Colors,这件需要帮忙。我有一些颜色的反射率值,需要将它们转换成L*a*b*C*h值 我找到了一些声称可以这样做的VisualBasic源代码,但我对VisualBasic一无所知,无法将其转换为C语言 有人能帮忙吗 样本数据 反射率值:0.35380、0.44130、0.50230、0.51650、0.52210、0.52780、0.53110、0.53350、0.53630、0.53900、0.54130、0.54330、0.54500、0.54630、0.54690、0.54680、0.54640

这件需要帮忙。我有一些颜色的反射率值,需要将它们转换成L*a*b*C*h值

我找到了一些声称可以这样做的VisualBasic源代码,但我对VisualBasic一无所知,无法将其转换为C语言

有人能帮忙吗

样本数据
反射率值:0.35380、0.44130、0.50230、0.51650、0.52210、0.52780、0.53110、0.53350、0.53630、0.53900、0.54130、0.54330、0.54500、0.54630、0.54690、0.54680、0.54640、0.54710、0.54940、0.55240、0.55330、0.55250、0.55200、0.55190、0.55220、0.55310、0.55260、0.55340、0.55400、0.55400、0.55400、0.55400、0.55400、0.55300、0.55400、0.55400、0.55400、0.55400、0.55400、0.55400、0.55400、0.55400、0.55400、0.55400、

double[] d65Vals_X = new double[31] { 0.137, 0.676, 1.603, 2.451, 3.418, 3.699, 3.064, 1.933, 0.802, 0.156, 0.039, 0.347, 1.070, 2.170, 3.397, 4.732, 6.070, 7.311, 8.291, 8.634, 8.672, 7.930, 6.446, 4.669, 3.095, 1.859, 1.056, 0.570, 0.274, .0121, 0.058 };
        double[] d65Vals_Y = new double[31] { 0.014, 0.069, 0.168, 0.300, 0.554, 0.890, 1.290, 1.838, 2.520, 3.226, 4.320, 5.621, 6.907, 8.059, 8.668, 8.855, 8.581, 7.951, 7.106, 6.004, 5.079, 4.065, 2.999, 2.042, 1.290, 0.746, 0.417, 0.223, 0.107, 0.047, 0.023 };
        double[] d65Vals_Z = new double[31] { 0.612, 3.110, 7.627, 12.095, 17.537, 19.888, 17.695, 13.000, 7.699, 3.938, 2.046, 1.049, 0.544, 0.278, 0.122, 0.035, 0.001, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 };

        private double FXYZ(double[] REF, int A){
            double XYZref = 0;
            double illXYZ = 0;
            int i;

            for (i = 0; i < 31; i++)
            {
                if (A == 0){
                    XYZref = XYZref + (REF[i] * d65Vals_X[i]);
                    illXYZ = illXYZ + d65Vals_X[i];
                } else if (A == 1){
                    XYZref = XYZref + (REF[i] * d65Vals_Y[i]);
                    illXYZ = illXYZ + d65Vals_Y[i];
                } else {
                    XYZref = XYZref + (REF[i] * d65Vals_Z[i]);
                    illXYZ = illXYZ + d65Vals_Z[i];
                }                
            }
            return (XYZref / (100 * illXYZ));
        }
        private void btnCalculate_Click(object sender, EventArgs e)
        {
            int i;

            double L, A, B;

            double[] reflexVals = new double[31];
            Console.Write("Reflex Data: ");
            for (i = 0; i < 31; i++)
            {
                TextBox reflex = this.Controls["txtReflex_" + (i + 1)] as TextBox;                
                reflexVals[i] = double.Parse(reflex.Text);
                Console.Write(reflexVals[i].ToString() + ", ");
            }
            Console.Write("\n");

            double[] FFXYZ = new double[3];
            double[] XYZ = new double[3];
            double CR = (1 / 3);
            CR = 0.33333333333333333333333333333333;
            for (i = 0; i < 3; i++)
            {
                XYZ[i] = FXYZ(reflexVals, i);
                Console.WriteLine("XYZ[" + i + "] = " + XYZ[i]);
                if (XYZ[i] > 0.008856)
                {

                    FFXYZ[i] = Math.Pow(XYZ[i], CR);
                    Console.WriteLine("FFXYZ[" + i + "] = " + Math.Pow(XYZ[i], CR));
                }
                else
                {
                    FFXYZ[i] = (7.787 * XYZ[i]) + (16 / 116);
                    Console.WriteLine("FFXYZ[" + i + "] = (7.787 * " + XYZ[i] + ") + (16 / 116)");
                }
            }

            if (XYZ[1] > 0.00856)
            {
                L = (116 * FFXYZ[1]) - 16;
                Console.WriteLine("L = (116 * " + FFXYZ[1] + ") - 16");
            }
            else
            {
                L = 903.3 * XYZ[1];
                Console.WriteLine("L = 903.3 * " + XYZ[1] + ")");
            }

            A = 500 * (FFXYZ[0] - FFXYZ[1]);
            B = 200 * (FFXYZ[1] - FFXYZ[2]);

            Console.WriteLine("A = 500 * (" + FFXYZ[0] + " - " + FFXYZ[1] + ")");
            Console.WriteLine("A = 200 * (" + FFXYZ[1] + " - " + FFXYZ[2] + ")");

            txtCalcL.Text = L.ToString();
            txtCalcA.Text = A.ToString();
            txtCalcB.Text = B.ToString();
        }
double[]d65Vals_X=新的双精度[31]{0.137,0.676,1.603,2.451,3.418,3.699,3.064,1.933,0.802,0.156,0.039,0.347,1.070,2.170,3.397,4.732,6.070,7.311,8.291,8.634,8.672,7.930,6.446,4.669,3.095,1.859,1.056,0.058,2740,0.050};
double[]d65Vals_Y=新的双精度[31]{0.014,0.069,0.168,0.300,0.554,0.890,1.290,1.838,2.520,3.226,4.320,5.621,6.907,8.059,8.668,8.855,8.581,7.951,7.106,6.004,5.079,4.065,2.999,2.042,1.290,0.746,0.417,0.223,0.023,0};
double[]d65Vals_Z=新的双精度[31]{0.612,3.110,7.627,12.095,17.537,19.888,17.695,13.000,7.699,3.938,2.046,1.049,0.544,0.278,0.122,0.035,0.001,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000};
专用双FXYZ(双[]参考,整数A){
双XYZref=0;
双illXYZ=0;
int i;
对于(i=0;i<31;i++)
{
如果(A==0){
XYZref=XYZref+(参考[i]*d65Vals_X[i]);
illXYZ=illXYZ+D65瓦尔_X[i];
}如果(A==1),则为else{
XYZref=XYZref+(参考[i]*d65Vals_Y[i]);
illXYZ=illXYZ+D65 VAL_Y[i];
}否则{
XYZref=XYZref+(参考[i]*d65Vals_Z[i]);
illXYZ=illXYZ+D65瓦耳兹[i];
}                
}
收益率(XYZref/(100*illXYZ));
}
私有void btnCalculate\u单击(对象发送者,事件参数e)
{
int i;
双L,A,B;
double[]reflecvals=新的double[31];
控制台。写入(“反射数据:”);
对于(i=0;i<31;i++)
{
TextBox reflection=this.Controls[“txtrelection_”+(i+1)]作为TextBox;
reflecvals[i]=double.Parse(reflection.Text);
Write(reflecvals[i].ToString()+“,”;
}
控制台。写入(“\n”);
double[]FFXYZ=新的double[3];
double[]XYZ=新的double[3];
双CR=(1/3);
CR=0.33333;
对于(i=0;i<3;i++)
{
XYZ[i]=FXYZ(反射,i);
Console.WriteLine(“XYZ[“+i+”]=”+XYZ[i]);
如果(XYZ[i]>0.008856)
{
FFXYZ[i]=数学功率(XYZ[i],CR);
Console.WriteLine(“FFXYZ[“+i+”]=”+Math.Pow(XYZ[i],CR));
}
其他的
{
FFXYZ[i]=(7.787*XYZ[i])+(16/116);
Console.WriteLine(“FFXYZ[“+i+”]=(7.787*“+XYZ[i]+”)(16/116)”;
}
}
如果(XYZ[1]>0.00856)
{
L=(116*FFXYZ[1])-16;
Console.WriteLine(“L=(116*”+FFXYZ[1]+”)-16”);
}
其他的
{
L=903.3*XYZ[1];
Console.WriteLine(“L=903.3*”+XYZ[1]+”);
}
A=500*(FFXYZ[0]-FFXYZ[1]);
B=200*(FFXYZ[1]-FFXYZ[2]);
Console.WriteLine(“A=500*(“+FFXYZ[0]+”-“+FFXYZ[1]+”));
Console.WriteLine(“A=200*(“+FFXYZ[1]+”-“+FFXYZ[2]+”));
txtCalcL.Text=L.ToString();
txtCalcA.Text=A.ToString();
txtCalcB.Text=B.ToString();
}

嗨,丹尼尔,遗憾的是,虽然没有太多,但我知道显示页面上的VB代码是有效的,但我在翻译它时遇到了困难:(