Formula to determine brightness of RGB color

前端 未结 20 3412
猫巷女王i
猫巷女王i 2020-11-21 23:16

I\'m looking for some kind of formula or algorithm to determine the brightness of a color given the RGB values. I know it can\'t be as simple as adding the RGB values toget

20条回答
  •  暖寄归人
    2020-11-21 23:52

    Rather than getting lost amongst the random selection of formulae mentioned here, I suggest you go for the formula recommended by W3C standards.

    Here's a straightforward but exact PHP implementation of the WCAG 2.0 SC 1.4.3 relative luminance and contrast ratio formulae. It produces values that are appropriate for evaluating the ratios required for WCAG compliance, as on this page, and as such is suitable and appropriate for any web app. This is trivial to port to other languages.

    /**
     * Calculate relative luminance in sRGB colour space for use in WCAG 2.0 compliance
     * @link http://www.w3.org/TR/WCAG20/#relativeluminancedef
     * @param string $col A 3 or 6-digit hex colour string
     * @return float
     * @author Marcus Bointon 
     */
    function relativeluminance($col) {
        //Remove any leading #
        $col = trim($col, '#');
        //Convert 3-digit to 6-digit
        if (strlen($col) == 3) {
            $col = $col[0] . $col[0] . $col[1] . $col[1] . $col[2] . $col[2];
        }
        //Convert hex to 0-1 scale
        $components = array(
            'r' => hexdec(substr($col, 0, 2)) / 255,
            'g' => hexdec(substr($col, 2, 2)) / 255,
            'b' => hexdec(substr($col, 4, 2)) / 255
        );
        //Correct for sRGB
        foreach($components as $c => $v) {
            if ($v <= 0.04045) {
                $components[$c] = $v / 12.92;
            } else {
                $components[$c] = pow((($v + 0.055) / 1.055), 2.4);
            }
        }
        //Calculate relative luminance using ITU-R BT. 709 coefficients
        return ($components['r'] * 0.2126) + ($components['g'] * 0.7152) + ($components['b'] * 0.0722);
    }
    
    /**
     * Calculate contrast ratio acording to WCAG 2.0 formula
     * Will return a value between 1 (no contrast) and 21 (max contrast)
     * @link http://www.w3.org/TR/WCAG20/#contrast-ratiodef
     * @param string $c1 A 3 or 6-digit hex colour string
     * @param string $c2 A 3 or 6-digit hex colour string
     * @return float
     * @author Marcus Bointon 
     */
    function contrastratio($c1, $c2) {
        $y1 = relativeluminance($c1);
        $y2 = relativeluminance($c2);
        //Arrange so $y1 is lightest
        if ($y1 < $y2) {
            $y3 = $y1;
            $y1 = $y2;
            $y2 = $y3;
        }
        return ($y1 + 0.05) / ($y2 + 0.05);
    }
    

提交回复
热议问题