¿Imagen de fondo oscura o ligera?
-
27-10-2019 - |
Pregunta
Estoy haciendo una conversión ODP-> HTML con PHP. Tengo problemas con lo siguiente:
Use el estilo: use la propiedad de color ventana de ventana para especificar si el color de primer plano de la ventana debe ser tan utilizado como el color de primer plano para un color de fondo claro y blanco para un color de fondo oscuro.
(Especificación OpenDocument versión 1.0, 15.4.4)
Si tengo una imagen de fondo, ¿cómo lo verifico, si esta imagen es ligera o oscura?
¿Tienes alguna idea?
Gracias de antemano, Levu
Solución
Pensé que este era un problema bastante interesante para resolver, así que pirateé un guión rápido para hacerlo. siguiendo las otras sugerencias proporcionadas
<?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;
}
Otros consejos
Posiblemente podría usar algún algoritmo de procesamiento de imágenes que examinaría el brillo del píxel y calcularía el brillo de la imagen media.
Este documento te hará comenzar:
http://www.kweii.com/site/color_theory/2007_lv/brightnesscalculation.pdf
Si está buscando usar GD, intentando usar imagecolorat
Para probar píxeles de la imagen. Puede determinar el RGB del color como se muestra en la página PHP MAN.
A continuación, tome las muestras RGB y determine su brillo utilizando un Fórmula de luminancia básica.
Determine un umbral para lo que considera la luz frente a la oscuridad y clasifica en consecuencia.