| |

Laboratorio: calcular fondo de imagen con PHP

Hace tiempo contábamos como rotar imágenes aleatoriamente, algo que se puede utilizar para la cabecera del blog (como hace mucha gente). El problema es cuando las imágenes son completamente distintas y hay que buscar un fondo que le convenga. Para ello nada mejor que un script PHP que te calcule el fondo según los colores de la imagen, ya sea calculando la media o la mediana (el que más aparece). Como veréis en el ejemplo, la media (arriba) y la mediana (abajo) devuelven valores distintos.
backgrounds.png

Primero declararemos variables y cargaremos la imagen.

// url de la imagen
$imagen = $_GET["imagen"];
// media = 1; mediana = 0
$media = $_GET["media"];
// Cargamos la imagen y calculamos el ancho y el alto
$im = imagecreatefromjpeg (getcwd().'/'.$imagen.'.jpg');
$ancho = imagesx($im);
$alto = imagesy($im);
// Definicion de variables
$color = ""; // variable auxilar
$r = 0;  // para sumar los componentes R (rojo)
$g = 0;  // para sumar los componentes G (verde)
$b = 0;  // para sumar los componentes B (azul)
// un array que guarda los valores para la mediana
$mediana = array();
// Valor por defecto
$RGB = "FFFFFF";

El array $mediana tendrá como clave los colores de la imagen y como valor el número de veces que aparece en la imagen.

El siguiente paso es leer los colores para ir calculando la media y la mediana, para la media voy sumando los componentes RGB y para la mediana cuento las veces que aparece un color.

// Leemos los colores y almacenamos tanto para la media como para la mediana
for ($i = 0; $i<$ancho; $i++) {
for ($j = 0; $j<$alto; $j++) {
// obtengo el color
$color = imagecolorat($im, $i, $j);
// Calculo componentes RGB
$raux = ($color >> 16) & 0xFF;
$gaux = ($color >> 8) & 0xFF;
$baux = $color & 0xFF;
// Sumo valores para la media
$r += $raux;
$g += $gaux;
$b += $baux;
// Añado valor para la mediana
$rgb = ((strlen(dechex($raux))==1)? "0":"") . dechex($raux) .
((strlen(dechex($gaux))==1)? "0":"") . dechex($gaux) .
((strlen(dechex($baux))==1)? "0":"") . dechex($baux);
$mediana[$rgb] = $mediana[$rgb]+1;
}
}

Y por último calculamos la media o la mediana, según hayamos elegido.

if (isset($media) && $media == '1') {
// Es media
// Calculo la media
$r = $r / ($ancho*$alto);
$g = $g / ($ancho*$alto);
$b = $b / ($ancho*$alto);
// Lo paso a notacion hexadecimal
$RGB = ((strlen(dechex($r))==1)? "0":"") . dechex($r) .
((strlen(dechex($g))==1)? "0":"") . dechex($g) .
((strlen(dechex($b))==1)? "0":"") . dechex($b);
} else {
// Es mediana
$val = 0;
// Reordeno la tabla
asort($mediana);
// Veo cual es el que más se repite
foreach ($mediana as $clave => $valor) {
if (max($valor, $val)) {
$RGB = $clave;
}
}
}

Te puedes bajar un ejemplo aquí

Similar Posts