phpcolors

"Distance" between colours in PHP


I'm looking for a function that can accurately represent the distance between two colours as a number or something.

For example I am looking to have an array of HEX values or RGB arrays and I want to find the most similar colour in the array for a given colour

eg. I pass a function a RGB value and the 'closest' colour in the array is returned


Solution

  • Each color is represented as a tuple in the HEX code. To determine close matches you need to subtract each RGB component separately.

    Example:

    Color 1: #112233 
    Color 2: #122334
    Color 3: #000000
    
    Difference between color1 and color2: R=1,  G=1   B=1  = 0x3 
    Difference between color3 and color1: R=11, G=22, B=33 = 0x66
    
    So color 1 and color 2 are closer than
    1 and 3.
    

    edit

    So you want the closest named color? Create an array with the hex values of each color, iterate it and return the name. Something like this;

    function getColor($rgb)
    {
        // these are not the actual rgb values
        $colors = array(BLUE =>0xFFEEBB, RED => 0x103ABD, GREEN => 0x123456);
    
        $largestDiff = 0;
        $closestColor = "";
        foreach ($colors as $name => $rgbColor)
        {
            if (colorDiff($rgbColor,$rgb) > $largestDiff)
            {
                $largestDiff = colorDiff($rgbColor,$rgb);
                $closestColor = $name;
            }
    
        }
        return $closestColor;
    
    }
    
    function colorDiff($rgb1,$rgb2)
    {
        // do the math on each tuple
        // could use bitwise operates more efficiently but just do strings for now.
        $red1   = hexdec(substr($rgb1,0,2));
        $green1 = hexdec(substr($rgb1,2,2));
        $blue1  = hexdec(substr($rgb1,4,2));
    
        $red2   = hexdec(substr($rgb2,0,2));
        $green2 = hexdec(substr($rgb2,2,2));
        $blue2  = hexdec(substr($rgb2,4,2));
    
        return abs($red1 - $red2) + abs($green1 - $green2) + abs($blue1 - $blue2) ;
    
    }