Detect "overall average" color of the picture Detect "overall average" color of the picture python python

Detect "overall average" color of the picture


You can use PHP to get an array of the color palette like so:

<?php function colorPalette($imageFile, $numColors, $granularity = 5) {    $granularity = max(1, abs((int)$granularity));    $colors = array();    $size = @getimagesize($imageFile);    if($size === false)    {       user_error("Unable to get image size data");       return false;    }    $img = @imagecreatefromjpeg($imageFile);   // Andres mentioned in the comments the above line only loads jpegs,    // and suggests that to load any file type you can use this:   // $img = @imagecreatefromstring(file_get_contents($imageFile));    if(!$img)    {       user_error("Unable to open image file");       return false;    }    for($x = 0; $x < $size[0]; $x += $granularity)    {       for($y = 0; $y < $size[1]; $y += $granularity)       {          $thisColor = imagecolorat($img, $x, $y);          $rgb = imagecolorsforindex($img, $thisColor);          $red = round(round(($rgb['red'] / 0x33)) * 0x33);          $green = round(round(($rgb['green'] / 0x33)) * 0x33);          $blue = round(round(($rgb['blue'] / 0x33)) * 0x33);          $thisRGB = sprintf('%02X%02X%02X', $red, $green, $blue);          if(array_key_exists($thisRGB, $colors))          {             $colors[$thisRGB]++;          }          else          {             $colors[$thisRGB] = 1;          }       }    }    arsort($colors);    return array_slice(array_keys($colors), 0, $numColors); } // sample usage: $palette = colorPalette('rmnp8.jpg', 10, 4); echo "<table>\n"; foreach($palette as $color) {    echo "<tr><td style='background-color:#$color;width:2em;'> </td><td>#$color</td></tr>\n"; } echo "</table>\n";

Which gives you an array whose values are higher for how often that color has been used.

EDITA commenter asked how to use this on all files in a directory, here it is:

    if ($handle = opendir('./path/to/images')) {        while (false !== ($file = readdir($handle))) {           $palette = colorPalette($file, 10, 4);           echo "<table>\n";            foreach($palette as $color) {                echo "<tr><td style='background-color:#$color;width:2em;'> </td><td>#$color</td></tr>\n";            }            echo "</table>\n";        }        closedir($handle);    }

might not want to do this on too many files, but it's your server.

Alternatively if you'd rather use Javascript Lokesh's Color-Theif library does exactly what you're looking for.


Combining JKirchartz and Alexander Hugestrand answer:

 function getAverage($sourceURL){    $image = imagecreatefromjpeg($sourceURL);    $scaled = imagescale($image, 1, 1, IMG_BICUBIC);     $index = imagecolorat($scaled, 0, 0);    $rgb = imagecolorsforindex($scaled, $index);     $red = round(round(($rgb['red'] / 0x33)) * 0x33);     $green = round(round(($rgb['green'] / 0x33)) * 0x33);     $blue = round(round(($rgb['blue'] / 0x33)) * 0x33);     return sprintf('#%02X%02X%02X', $red, $green, $blue);  }

Tried and tested, returns hex string.


$img = glob('img/*');foreach ($img as $key => $value) {    $info = getimagesize($value);    $mime = $info['mime'];    switch ($mime) {        case 'image/jpeg':            $image_create_func = 'imagecreatefromjpeg';            break;        case 'image/png':            $image_create_func = 'imagecreatefrompng';            break;        case 'image/gif':            $image_create_func = 'imagecreatefromgif';            break;    }    $avg = $image_create_func($value);    list($width, $height) = getimagesize($value);    $tmp = imagecreatetruecolor(1, 1);    imagecopyresampled($tmp, $avg, 0, 0, 0, 0, 1, 1, $width, $height);    $rgb = imagecolorat($tmp, 0, 0);    $r = ($rgb >> 16) & 0xFF;    $g = ($rgb >> 8) & 0xFF;    $b = $rgb & 0xFF;    echo '<div style="text-align:center; vertical-align: top; display:inline-block; width:100px; height:150px; margin:5px; padding:5px; background-color:rgb('.$r.','.$g.','.$b.');">';    echo '<img style="width:auto; max-height:100%; max-width: 100%; vertical-align:middle; height:auto; margin-bottom:5px;" src="'.$value.'">';    echo '</div>';

you can get the value of the average color with $r, $g, & $bresample the image is much more better than only scale it !