mirror of
https://git.tt-rss.org/git/tt-rss.git
synced 2026-01-19 01:35:27 +00:00
try to improve color guessing algorithm a bit
This commit is contained in:
@@ -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;
|
||||
}
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user