Ver Mensaje Individual
  #7 (permalink)  
Antiguo 08/12/2013, 09:32
Avatar de marlanga
marlanga
 
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Problema con paleta de colores PHP

Ya te puse cómo obtener la distancia entre dos colores para elegir el más próximo. No se casi nada de la teoría de color, así que es probable que exista otra fórmula de proximidad que de mejores resultados.

Código PHP:
Ver original
  1. <?php
  2. header( "Content-type: image/png" );
  3. $imageName="cat2 - copia.jpg";
  4. $size  = getimagesize($imageName);
  5. $img = imagecreatefromjpeg($imageName);
  6.  
  7. $paleta=array(
  8.     array(15, 138, 73),
  9.     array(92, 207, 151),
  10.     array(135, 221, 173),
  11.     array(121, 230, 51),
  12.     array(87, 190, 0),
  13.     array(188, 242, 94)
  14. );
  15.  
  16. function colorCercano($color, $paleta){
  17.     $n=count($paleta);
  18.     $distancia=INF;
  19.     $mejor=0;
  20.     for ($i=0;$i<$n;$i++)
  21.     {
  22.         $actual=abs($color[0]-$paleta[$i][0])+abs($color[1]-$paleta[$i][1])+abs($color[2]-$paleta[$i][2]);
  23.         //$actual=sqrt(pow($color[0]-$paleta[$i][0],2)+pow($color[1]-$paleta[$i][1],2)+pow($color[2]-$paleta[$i][2],2));
  24.         if ($distancia>$actual)
  25.         {
  26.             $distancia=$actual;
  27.             $mejor=$i;
  28.         }
  29.     }
  30.     return $paleta[$mejor];
  31. }
  32.  
  33. for ($x=0;$x<$size[0];$x++)
  34. {
  35.     for ($y=0;$y<$size[1];$y++)
  36.     {
  37.         $pixel = imagecolorat($img, $x, $y);
  38.         $pixelColor = imagecolorsforindex($img, $pixel);
  39.  
  40.         $colorFinal=colorCercano(array($pixelColor["red"],$pixelColor["green"],$pixelColor["blue"]),$paleta);
  41.  
  42.         $index=imagecolorexact($img,$colorFinal[0],$colorFinal[1],$colorFinal[2]);
  43.         imagesetpixel($img, $x, $y, $index);
  44.     }
  45. }
  46.  
  47. imagepng($img);