颜色RGB转LAB算法

子沫
2021-01-18 / 1 评论 / 1,556 阅读 / 正在检测是否收录...

废话不多说,show my code

//RGB转LAB
    public function RgbToLab($RED,$GREEN,$BLUE)
    {
        $x=0.95047;
        $y=1;
        $z=1.08883;
        if ($RED/255>0.04045){
            $R=pow(($RED/255+0.055)/1.055,2.4);
        }else{
            $R=($RED/255)/12.92;
        }

        if ($GREEN/255>0.04045){
            $G=pow(($GREEN/255+0.055)/1.055,2.4);
        }else{
            $G=($GREEN/255)/12.92;
        }

        if ($BLUE/255>0.04045){
            $b=pow(($BLUE/255+0.055)/1.055,2.4);
        }else{
            $b=($BLUE/255)/12.92;
        }

        $X=0.4124*$R+0.3576*$G+0.1805*$b;
        $Y=0.2126*$R+0.7152*$G+0.0722*$b;
        $Z=0.0193*$R+0.1192*$G+0.9505*$b;

        if (($Y/$y)>pow(6/29,3)){
            $L=116*pow($Y/$y,1/3)-16;
        }else{
            $L=116*((1/3)*pow(29/6,2)*($Y/1)+4/29)-16;
        }

        if(($X/$x)>pow(6/29,3)){
            if(($Y/$y)>pow(6/29,3)){
                $A=500*(pow($X/$x,1/3)-pow($Y/$y,1/3));
            }else{
                $A=500*(pow($X/$x,1/3)-((1/3)*pow(29/6,2)*($Y/$y)+4/29));
            }

        }else{
            if(($Y/$y)>pow(6/29,3)){
                $A=500*(((1/3)*pow(29/6,2)*($X/$x)+4/29)-pow($Y/$y,1/3));
            }else{
                $A=500*(((1/3)*pow(29/6,2)*($X/$x)+4/29)-((1/3)*pow(29/6,2)*($Y/$y)+4/29));
            }

        }

        if(($Y/$y)>pow(6/29,3)){
            if(($Z/$z)>pow(6/29,3)){
                $B=200*(pow($Y/$y,1/3)-pow($Z/$z,1/3));
            }else{
                $B=200*(pow($Y/$y,1/3)-((1/3)*pow(29/6,2)*($Z/$z)+4/29));
            }

        }else{
            if(($Z/$z)>pow(6/29,3)){
                $B=200*(((1/3)*pow(29/6,2)*($Y/$y)+4/29)-pow($Z/$z,1/3));
            }else{
                $B=200*(((1/3)*pow(29/6,2)*($Y/$y)+4/29)-((1/3)*pow(29/6,2)*($Z/$z)+4/29));
            }
        }
        return ['L'=>$L,'A'=>$A,'B'=>$B];
    }
1

评论 (1)

取消
  1. 头像
    str
    Android · Google Chrome

    表情

    回复