try to improve color guessing algorithm a bit
This commit is contained in:
parent
e7480cc13b
commit
6ac722d5b1
|
@ -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;
|
||||
}
|
||||
?>
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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'");
|
||||
|
|
Loading…
Reference in New Issue