From 6ac722d5b1e336dcb8eebec04496150c2f116154 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 15 Apr 2013 17:01:51 +0400 Subject: [PATCH] try to improve color guessing algorithm a bit --- include/colors.php | 60 +++++++++++++++++++++++++++++++++++++++++++ include/functions.php | 41 ----------------------------- include/rssfuncs.php | 13 +++------- 3 files changed, 64 insertions(+), 50 deletions(-) diff --git a/include/colors.php b/include/colors.php index d1e97072..19c89151 100644 --- a/include/colors.php +++ b/include/colors.php @@ -1,5 +1,7 @@ "#f0f8ff", "antiquewhite" => "#faebd7", @@ -278,4 +280,62 @@ function hsl2rgb($arr) { return array($r, $g, $B); } + function colorPalette($imageFile, $numColors, $granularity = 5) { + $granularity = max(1, abs((int)$granularity)); + $colors = array(); + + $size = @getimagesize($imageFile); + + if (strtolower($size['mime']) == 'image/vnd.microsoft.icon') { + $ico = new floIcon(); + @$ico->readICO($imageFile); + + if(count($ico->images)==0) + return null; + else + $img = @$ico->images[count($ico->images)-1]->getImageResource(); + + } else { + $img = @imagecreatefromstring(file_get_contents($imageFile)); + } + + if (!$img) 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); + } + + function calculate_avg_color($iconFile) { + $palette = colorPalette($iconFile, 4, 4); + + if (is_array($palette)) { + foreach ($palette as $p) { + $hsl = rgb2hsl(_color_unpack("#$p")); + + if ($hsl[1] > 0.25 && $hsl[2] > 0.25 && + !($hsl[0] >= 0 && $hsl[0] < 0.01 && $hsl[1] < 0.01) && + !($hsl[0] >= 0 && $hsl[0] < 0.01 && $hsl[2] > 0.99)) { + + return _color_pack(hsl2rgb($hsl)); + } + } + } + return false; + } ?> diff --git a/include/functions.php b/include/functions.php index 6372db1f..306014d9 100644 --- a/include/functions.php +++ b/include/functions.php @@ -512,47 +512,6 @@ } } - function calculate_avg_color($iconFile) { - - require_once "lib/floIcon.php"; - - $imgInfo = @getimagesize($iconFile); - - if(strtolower($imgInfo['mime'])=='image/vnd.microsoft.icon') { - $ico = new floIcon(); - @$ico->readICO($iconFile); - //TODO: error logging - if(count($ico->images)==0) - return null; - else { - $image = @$ico->images[count($ico->images)-1]->getImageResource(); - } - $type = "ico"; - } - elseif(strtolower($imgInfo['mime'])=='image/png') { - $image = imagecreatefrompng($iconFile); - $type = 'png'; - } - elseif(strtolower($imgInfo['mime'])=='image/jpeg') { - $image = imagecreatefromjpeg($iconFile); - $type = 'jpg'; - } - elseif(strtolower($imgInfo['mime'])=='image/gif') { - $image = imagecreatefromgif($iconFile); - $type = 'gif'; - } - //TODO: error logging - if (is_null($image)) - return null; - $width = imagesx($image); - $height = imagesy($image); - $pixel = imagecreatetruecolor(1, 1); - imagecopyresampled($pixel, $image, 0, 0, 0, 0, 1, 1, $width, $height); - $rgb = imagecolorat($pixel, 0, 0); - $color = imagecolorsforindex($pixel, $rgb); - return $color; - } - function print_select($id, $default, $values, $attributes = "") { print "