Фоновое изображение темное или свет?
-
27-10-2019 - |
Вопрос
Я делаю преобразование ODP-> HTML с PHP. У меня проблемы со следующим:
Используйте стиль: свойство с использованием цветного цвета-типа, чтобы указать, следует ли использовать цвет переднего плана в окне, как цвет переднего плана для светлого цвета фона и белого цвета для темного цвета фона.
(Спецификация Opendocument Версия 1.0, 15.4.4)
Если у меня есть фоновое изображение, как мне проверить, если это изображение легкое или темное?
У тебя есть идеи?
Заранее спасибо, леву
Решение
Я подумал, что это была довольно интересная проблема для решения, поэтому я взломал быстрый сценарий, чтобы сделать это. Следуя другим предложениям
<?php
// TODO supply your own filenames
$filenames = array(
'testpics/client-bella-vi.jpg',
'testpics/istockphoto_8577991-concept-of-business-people-crowd.jpg',
'testpics/medium-gray.jpg');
// loop though each file
foreach ($filenames as $filename) {
echo "$filename<br/>";
$luminance = get_avg_luminance($filename,10);
echo "AVG LUMINANCE: $luminance<br />";
// assume a medium gray is the threshold, #acacac or RGB(172, 172, 172)
// this equates to a luminance of 170
if ($luminance > 170) {
echo "Black Text<br />";
} else {
echo 'White Text<br />';
}
echo "<br />";
}
exit;
// get average luminance, by sampling $num_samples times in both x,y directions
function get_avg_luminance($filename, $num_samples=10) {
$img = imagecreatefromjpeg($filename);
$width = imagesx($img);
$height = imagesy($img);
$x_step = intval($width/$num_samples);
$y_step = intval($height/$num_samples);
$total_lum = 0;
$sample_no = 1;
for ($x=0; $x<$width; $x+=$x_step) {
for ($y=0; $y<$height; $y+=$y_step) {
$rgb = imagecolorat($img, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
// choose a simple luminance formula from here
// http://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color
$lum = ($r+$r+$b+$g+$g+$g)/6;
$total_lum += $lum;
// debugging code
// echo "$sample_no - XY: $x,$y = $r, $g, $b = $lum<br />";
$sample_no++;
}
}
// work out the average
$avg_lum = $total_lum/$sample_no;
return $avg_lum;
}
Другие советы
Вы можете использовать какой -то алгоритм обработки изображений, который бы изучил яркость пикселя и рассчитывает яркости средней изображения.
Этот документ приведет вас к началу:
http://www.kweii.com/site/color_theory/2007_lv/brightnesscalculation.pdf
Если вы хотите использовать GD, пытаясь использовать imagecolorat
Чтобы попробовать пиксели изображения. Вы можете определить RGB цвета, как показано на странице PHP Man.
Затем возьмите образец (ы) RGB и определите их яркость, используя Основная формула яркости.
Определите порог для того, что вы считаете светом и темнотой, и соответственно классифицируйте.