Ver Mensaje Individual
  #5 (permalink)  
Antiguo 06/12/2013, 08:27
Avatar de neodani
neodani
 
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Problema con paleta de colores PHP

Gracias de nuevo marlanga, lo que indicas suena muy bien pero no veo la forma de hacerlo

En el ejemplo anterior, me salian 7 colores diferentes en la imagen, cuando en verdad solo necesitaba 3 colores.

La imagen de pruebas es la siguiente, (no tengas en cuenta el fondo blanco, que para subirla online necesitaba que fuese de 150x150, cuenta que la imagen son las 6 redonditas con el fondo negro :D)



Si mi paleta fuese los 3 colores siguientes:

#2B2B2B
#50AEC0
#82E0F2

Me interesa saber el número de pixeles que hay de cada color, considerando que los que no sean esos colores, me los cuente como si lo fueran (acercandose a color más próximo de mi paleta y contandolos como tal).

Para sacar los colores de mi imagen de ejemplo, sigo un patron y cojo los pixels de las siguientes posiciones:

Posicion X: 13 | Y: 7
Red: 129 | Green: 222 | Blue: 239
Posicion X: 13 | Y: 13
Red: 43 | Green: 43 | Blue: 43
Posicion X: 25 | Y: 7
Red: 75 | Green: 160 | Blue: 174
Posicion X: 25 | Y: 13
Red: 43 | Green: 43 | Blue: 43
Posicion X: 37 | Y: 7
Red: 71 | Green: 149 | Blue: 162
Posicion X: 37 | Y: 13
Red: 43 | Green: 43 | Blue: 43
Posicion X: 49 | Y: 7
Red: 73 | Green: 160 | Blue: 174
Posicion X: 49 | Y: 13
Red: 43 | Green: 43 | Blue: 43
Posicion X: 61 | Y: 7
Red: 80 | Green: 174 | Blue: 192
Posicion X: 61 | Y: 13
Red: 43 | Green: 43 | Blue: 43
Posicion X: 73 | Y: 7
Red: 78 | Green: 176 | Blue: 193
Posicion X: 73 | Y: 13
Red: 43 | Green: 43 | Blue: 43

En total me saca 7 colores, pero el resultado que busco es, sin contar el fondo negro, imagina que solo cojes el pixel central de cada redonda (en eso no tengo dificultades), y te salen los 6 colores de verde diferente, pero en verdad solo necesitas 2 colores de verde, los dos de mi paleta.

Me debería decir que ha encontrado
2 bolas #82E0F2
4 bolas #50AEC0

Mi código

Código PHP:
Ver original
  1. function colorPalette($imageFile, $numColors, $granularity = 12) {
  2.     $granularity = max(1, abs((int)$granularity));
  3.     $colors = array();
  4.     $size = @getimagesize($imageFile);
  5.  
  6.     if( $size === false ){
  7.         user_error("Unable to get image size data");
  8.         return false;
  9.     }
  10.  
  11.     $img = @imagecreatefromstring(file_get_contents($imageFile));
  12.  
  13.     if( !$img ){
  14.         user_error("Unable to open image file");
  15.         return false;
  16.     }
  17.  
  18.     echo "<br/>size0: ".$size[0].'<br/>';
  19.     echo "size1: ".$size[1].'<br/>';
  20.  
  21.     for($x = 13; $x < $size[0]; $x += $granularity){ // Horizontal 
  22.  
  23.         for($y = 7; $y < $size[1]; $y += $granularity/2){ // Vertical
  24.        
  25.             echo "Posicion X: $x | Y: $y<br/>";
  26.             $thisColor = imagecolorat($img, $x, $y);
  27.             $rgb = imagecolorsforindex($img, $thisColor);
  28.                
  29.             $red = $rgb['red'];
  30.             $green = $rgb['green'];
  31.             $blue = $rgb['blue'];
  32.            
  33.             $result = imagecolorclosest($img, $red, $green, $blue);
  34.             $result = imagecolorsforindex($img, $result);
  35.             $result = "({$result['red']}, {$result['green']}, {$result['blue']})";
  36.            
  37.             $thisRGB = sprintf('%02X%02X%02X', $red, $green, $blue);
  38.             echo "Red: $red | Green: $green | Blue: $blue<br/>";
  39.             if(array_key_exists($thisRGB, $colors)){
  40.                 $colors[$thisRGB]++;
  41.             }else{
  42.                 $colors[$thisRGB] = 1;
  43.             }
  44.         }
  45.     }
  46.     arsort($colors);
  47.     return array_slice(array_keys($colors), 0, $numColors);
  48. }
  49.  
  50. /* PRINCIPAL */
  51.  
  52. $archivo = 'espada3.png';
  53.  
  54. echo '<img src="'.$archivo.'"/>';
  55.  
  56. $palette = colorPalette($archivo,32, 12);
  57.  
  58. echo "<table>\n";
  59. foreach($palette as $color){
  60.    echo "<tr><td style='background-color:#$color;width:2em;'>&nbsp;</td><td>#$color</td></tr>\n";
  61. }
  62. echo "</table>\n";

Muchas gracias de antemano!!!!