Imagem de fundo escura ou clara?
-
27-10-2019 - |
Pergunta
Estou fazendo uma conversão ODP-> HTML com PHP.Tenho problemas com o seguinte:
Use o estilo: use-window-font-color propriedade para especificar se o a cor do primeiro plano da janela deve ser tão usado como cor de primeiro plano para um cor de fundo claro e branco para um cor de fundo escura.
(especificação OpenDocument versão 1.0, 15.4.4)
Se eu tiver uma imagem de fundo, como faço para verificar se essa imagem é clara ou escura?
Você tem alguma ideia?
Agradecemos antecipadamente, Levu
Solução
Achei que esse era um problema bem interessante de resolver, então criei um script rápido para fazer isso.seguindo as outras sugestões fornecidas
<?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;
}
Outras dicas
você poderia usar algum algoritmo de processamento de imagem que examinaria o brilho do pixel e calcularia o brilho médio da imagem.
este documento irá ajudá-lo a começar:
http://www.kweii.com/site/color_theory/2007_LV/BrightnessCalculation.pdf
Se você deseja usar o GD, tente usar imagecolorat
paraamostra de pixels da imagem.Você pode determinar o RGB da cor conforme mostrado na página de manual do PHP.
Em seguida, pegue a (s) amostra (s) RGB e determine seu brilho usando fórmula de luminância básica .
Determine um limite para o que você considera claro vs. escuro e categorize de acordo.