2009-10-10 16 views
6

espero que alguien pueda ayudar,PHP - Reemplazar color dentro de la imagen

he hecho un script que enmascara imágenes ... Sin embargo, es dependiente de un color para enmascarar con (estilo 'pantalla verde'). El problema es si la imagen que estoy enmascarando contiene ese color, está arruinada.

Lo que estoy buscando hacer es antes de enmascarar la imagen reemplazar cualquier posible aparición de mi color de clave (0,0,255) con un color similar como 0,0,254.

He encontrado algunas soluciones, extraído del GIF o 256 colores PNG, ya que se indexan ..

Así que mi pregunta es también será más eficiente para convertirlo en un archivo GIF o 256 png y luego mirar a través de la indexe y reemplace el color o busque a través de cada píxel y reemplace los colores.

Gracias,

+0

¿Qué quiere decir con "enmascarar"? ¿Tiene partes transparentes de la imagen? ¿Para qué está utilizando el color verde (o el color chromakey que esté usando) exactamente? – lapo

+0

mediante enmascaramiento Me refiero a hacer un cuadrado relleno con mi color chromakey, luego cortar una forma con píxeles transparentes y luego superponerlo sobre una imagen. Luego, reemplazando el color chromakey con píxeles transparentes – Mark

Respuesta

9

es necesario abrir el archivo de entrada y escanear cada píxel para comprobar su valor chromokey.

Algo como esto:

// Open input and output image 
$src = imagecreatefromJPEG('input.jpg') or die('Problem with source'); 
$out = ImageCreateTrueColor(imagesx($src),imagesy($src)) or die('Problem In Creating image'); 

// scan image pixels 
for ($x = 0; $x < imagesx($src); $x++) { 
    for ($y = 0; $y < imagesy($src); $y++) { 
     $src_pix = imagecolorat($src,$x,$y); 
     $src_pix_array = rgb_to_array($src_pix); 

      // check for chromakey color 
      if ($src_pix_array[0] == 0 && $src_pix_array[1] == 0 && $src_pix_array[2] == 255) { 
       $src_pix_array[2] = 254; 
      } 


     imagesetpixel($out, $x, $y, imagecolorallocate($out, $src_pix_array[0], $src_pix_array[1], $src_pix_array[2])); 
    } 
} 


// write $out to disc 

imagejpeg($out, 'output.jpg',100) or die('Problem saving output image'); 
imagedestroy($out); 

// split rgb to components 
function rgb_to_array($rgb) { 
    $a[0] = ($rgb >> 16) & 0xFF; 
    $a[1] = ($rgb >> 8) & 0xFF; 
    $a[2] = $rgb & 0xFF; 

    return $a; 
} 
+0

Esto se ve fantástico ... Eficiencia sabia ¿cómo crees que se podría comparar a la conversión de la imagen a una plataforma de 256, usando imagecolorexact y imagecolorset para reemplazar cualquier aparición del color y luego convertirlo de nuevo a una ¿imagen de color verdadero? – Mark

+0

Funciona perfectamente, pero acabo de probarlo y es al menos 5 veces menos eficiente que convertirlo en una imagen de paleta de 256 y viceversa ... pero para la calidad de imagen es superior ya que se pierde calidad al convertirlo en 256 colores, ¡Gracias, radio4fan! – Mark

2

Aquí está la solución de color que primero se convierte en 256 palets reemplazar:

//Open Image 
$Image = imagecreatefromJPEG('input.jpg') or die('Problem with source'); 

//set the image to 256 colours 
imagetruecolortopalette($Image,0,256); 

//Find the Chroma colour 
$RemChroma = imagecolorexact($Image, 0,0,255); 

//Replace Chroma Colour 
imagecolorset($Image,$RemChroma,0,0,254); 

//Use function to convert back to true colour 
imagepalettetotruecolor($Image); 




function imagepalettetotruecolor(&$img) 
    { 
     if (!imageistruecolor($img)) 
     { 
      $w = imagesx($img); 
      $h = imagesy($img); 
      $img1 = imagecreatetruecolor($w,$h); 
      imagecopy($img1,$img,0,0,0,0,$w,$h); 
      $img = $img1; 
     } 
    } 

yo personalmente prefiero solución radio4fans ya que es sin pérdidas, pero si la velocidad es su objetivo esto es superior.

Cuestiones relacionadas