2009-10-10 3 views
6

J'espère que quelqu'un peut aider,PHP - Remplacer couleur dans l'image

J'ai fait un script que les images de masques ... mais il est tributaire d'une couleur pour masquer avec (style « écran vert »). Le problème est que si l'image que je masque contient cette couleur, elle est ruinée. Ce que je cherche à faire, c'est avant de masquer l'image remplacer toute occurance de ma couleur de frappe (0,0255) avec une couleur similaire, comme 0,0254.

J'ai trouvé quelques solutions basées autour de GIF ou 256 couleurs PNG comme ils sont indexés ..

Donc, ma question est aussi il sera plus efficace de le convertir en un fichier GIF ou 256 .png puis regarder à travers le indexer et remplacer la couleur ou rechercher à travers chaque pixel et remplacer les couleurs.

Merci,

+0

Que voulez-vous dire par "masquage"? Avoir des parties transparentes de l'image? Qu'est-ce que vous utilisez exactement la couleur verte (ou la couleur chromakey que vous utilisez)? – lapo

+0

en masquant, je veux dire faire un carré rempli de ma couleur chromakey, puis découper une forme avec des pixels transparents, puis superposer cela sur une image. Remplacer la couleur chromakey par des pixels transparents – Mark

Répondre

9

Vous devez ouvrir le fichier d'entrée et analyser chaque pixel pour vérifier votre valeur chromokey.

Quelque chose comme ceci:

// 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

Cela a l'air fantastique ... Efficacité sage comment pensez-vous que cela se compare à la conversion de l'image en 256 palette, en utilisant imagecolorexact et imagecolorset pour remplacer toute occurrence de la couleur puis en la convertissant en vraie image en couleur? – Mark

+0

Cela fonctionne parfaitement, mais je l'ai testé et il est au moins 5 fois moins efficace que de le convertir en une image de 256 palettes ... mais pour la qualité d'image, il est supérieur car la qualité est perdue en 256 couleurs, Merci radio4fan! – Mark

2

Voici REPLACE solution de couleur qui convertit tout d'abord à 256 palettes:

//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; 
     } 
    } 

Personnellement, je préfère la solution de radio4fans comme il est sans perte, mais si la vitesse est votre but c'est supérieur.