2009-10-10 4 views
6

Ich hoffe, jemand helfen kannPHP - Ersetzen Sie Farbe in Bild

Ich habe ein Skript aus, die Masken Bilder ... aber es ist auf eine Farbe angewiesen ist mit zu maskieren (‚Green-Screen‘ -Stil). Das Problem ist, wenn das Bild, das ich maskiere, diese Farbe enthält, ist es ruiniert.

Was ich zu tun versuche, ist vor dem Maskieren des Bildes ersetzen alle Vorkommen meiner Keying Farbe (0,0,255) mit einer ähnlichen Farbe wie 0,0,254.

Ich habe ein paar Lösungen auf Basis Gifs oder 256 Farben PNG gefunden, wie sie indiziert sind ..

So auch meine Frage ist, wird es effizienter sein, es dann durch die schauen, um ein gif oder 256 png zu konvertieren Index und ersetzen Sie die Farbe oder suchen Sie durch jedes Pixel und ersetzen Sie die Farben.

Danke,

+0

Was meinst du mit "maskieren"? Transparente Teile des Bildes haben? Wofür verwenden Sie genau die grüne Farbe (oder welche Chromakey-Farbe verwenden Sie?)? – lapo

+0

durch Maskieren Ich meine, mache ein Quadrat mit meiner Chromakey-Farbe gefüllt, dann schneide eine Form daraus mit transparenten Pixeln aus und überklebe es dann über einem Bild. Ersetzen Sie dann die Chromakey - Farbe durch transparente Pixel – Mark

Antwort

9

Sie müssen die Eingabedatei öffnen und jedes Pixel scannen für Ihren chromokey Wert zu überprüfen.

Etwas wie folgt aus:

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

Das sieht fantastisch aus ... Wie effizient wäre Ihrer Ansicht nach die Umwandlung des Bildes in eine 256 - Palette mit imagecolorexact und imagecolorset, um jedes Vorkommen der Farbe zu ersetzen und dann wieder in a umzuwandeln Echtes Farbbild? – Mark

+0

Es funktioniert perfekt, aber ich habe es gerade getestet und es ist mindestens 5 mal weniger effizient, als es zu einem 256-Paletten-Bild und zurück zu konvertieren ... aber für die Bildqualität ist es überlegen, da die Qualität bei der Umwandlung in 256 Farben verloren geht, Danke radio4fan! – Mark

2

Hier ist die Farblösung ersetzen, die zuerst auf 256 Palette konvertiert:

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

Ich persönlich bevor radio4fans Lösung, da sie verlustfrei ist, aber wenn die Geschwindigkeit ist Ihre Ziel ist dies überlegen.