Me mudo

Este blog no recibirá ya más actualizaciones. Ve al nuevo blog enricflorit.com o averigua por qué me mudo.

lunes, 3 de septiembre de 2012

Cómo crear paletas de colores en PHP

Hoy me he despertado con una idea en mente: crear un script que imprima marcas de agua (con un copyright, url de una web o similar) en las fotos que se vayan a mostrar en una web. Pero planteando el problema más detenidamente, nos encontramos con que:
  1. La imagen no siempre tendrá los mismos colores, por lo que el color del texto deberá variar,
  2. Puede que el texto tape algún detalle de la foto que no nos interese, así que deberíamos poder cambiar la posición del texto,
  3. Si el texto va a ser semitransparente, tal vez no sea necesario lo anterior.
Fijándome en el primer punto, me he decidido a buscar un poco por internet para encontrar una función que pudiera solucionar el problema del color.
He encontrado más que eso: una función que crea paletas de colores. Devuelve los valores hexadecimales de los colores predominantes por orden de importancia. Una maravilla salida de los foros de StackOverflow. Aquí tenéis el enlace. El código de la función es el siguiente:
function colorPalette($imageFile, $numColors, $granularity = 5) {
    $granularity = max(1, abs((int)$granularity)); 
    $colors = array(); 
    $size = @getimagesize($imageFile); 

    if( $size === false ){ 
        user_error("Unable to get image size data"); 
        return false; 
    }

    $img = @imagecreatefromstring(file_get_contents($imageFile));

    if( !$img ){ 
        user_error("Unable to open image file"); 
        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); 
}
A este código se le pueden dar múltiples aplicaciones, a parte de servirme para el script de marcas de agua:
  • Poder crear un mosaico de imagenes (teniendo una buena base de datos).
  • Crear paletas de colores para sitios web.
  • Obtener los colores predominantes de una web, combinándolo con un script de captura de pantalla.
¿Qué otras aplicaciones se os ocurren para este tipo de scripts?

Descarga el ejemplo en Dropbox

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...