try to improve color guessing algorithm a bit

This commit is contained in:
Andrew Dolgov 2013-04-15 17:01:51 +04:00
parent e7480cc13b
commit 6ac722d5b1
3 changed files with 64 additions and 50 deletions

View File

@ -1,5 +1,7 @@
<?php
require_once "lib/floIcon.php";
function _resolve_htmlcolor($color) {
$htmlcolors = array ("aliceblue" => "#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;
}
?>

View File

@ -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 "<select name=\"$id\" id=\"$id\" $attributes>";
foreach ($values as $v) {

View File

@ -412,18 +412,13 @@
$favicon_file = ICONS_DIR . "/$feed.ico";
if (file_exists($favicon_file)) {
$favicon_color = calculate_avg_color($favicon_file);
require_once "colors.php";
if (is_array($favicon_color))
$tmp = array($favicon_color['red'],
$favicon_color['green'],
$favicon_color['blue']);
$favicon_color = db_escape_string($link,
calculate_avg_color($favicon_file));
$favicon_colorstring = ",favicon_avg_color = '" .
_color_pack($tmp) . "'";
}
$favicon_colorstring = ",favicon_avg_color = '".$favicon_color."'";
}
db_query($link, "UPDATE ttrss_feeds SET favicon_last_checked = NOW() $favicon_colorstring
WHERE id = '$feed'");