2016-01-22 29 views
12

Ho ricavato uno script di sostituzione colore perfetto da https://stackoverflow.com/a/32710756/1620626. Voglio sostituire il colore target con lo sfondo dell'immagine. L'immagine originale è in background con luce verde (rgb:0b255b1). Posso sostituirlo con il blu ma non ho idea di come sostituire con l'immagine. Ecco la sceneggiatura.Sostituire il colore RGB specifico con un'altra immagine utilizzando PHP

Questa è l'immagine originale. 01.jpg

Dopo aver elaborato questa foto con la sceneggiatura. Ci penso io. enter image description here

La sceneggiatura sostituisce perfettamente il colore di destinazione con quello nuovo. Ora voglio passare dal blu allo sfondo. Quindi l'idea finale è. Questa ragazza sull'immagine di sfondo che ho scelto.

Ecco il codice:

<?php 
//https://stackoverflow.com/a/32710756/1620626 
function RGBtoHSL($r, $g, $b) { 
    $r /= 255; 
    $g /= 255; 
    $b /= 255; 
    $max = max($r, $g, $b); 
    $min = min($r, $g, $b); 
    $l = ($max + $min)/2; 
    $d = $max - $min; 
    if($d == 0){ 
     $h = $s = 0; 
    } else { 
     $s = $d/(1 - abs(2 * $l - 1)); 
     switch($max){ 
      case $r: 
       $h = 60 * fmod((($g - $b)/$d), 6); 
       if ($b > $g) { 
        $h += 360; 
       } 
       break; 
      case $g: 
       $h = 60 * (($b - $r)/$d + 2); 
       break; 
      case $b: 
       $h = 60 * (($r - $g)/$d + 4); 
       break; 
     } 
    } 
    return array(round($h, 2), round($s, 2), round($l, 2)); 
} 

function HSLtoRGB($h, $s, $l){ 
    $c = (1 - abs(2 * $l - 1)) * $s; 
    $x = $c * (1 - abs(fmod(($h/60), 2) - 1)); 
    $m = $l - ($c/2); 
    if ($h < 60) { 
     $r = $c; 
     $g = $x; 
     $b = 0; 
    } else if ($h < 120) { 
     $r = $x; 
     $g = $c; 
     $b = 0; 
    } else if ($h < 180) { 
     $r = 0; 
     $g = $c; 
     $b = $x; 
    } else if ($h < 240) { 
     $r = 0; 
     $g = $x; 
     $b = $c; 
    } else if ($h < 300) { 
     $r = $x; 
     $g = 0; 
     $b = $c; 
    } else { 
     $r = $c; 
     $g = 0; 
     $b = $x; 
    } 
    $r = ($r + $m) * 255; 
    $g = ($g + $m) * 255; 
    $b = ($b + $m ) * 255; 
    return array(floor($r), floor($g), floor($b)); 
} 

/* ---------------CHANGE THESE------------------- */ 
$colorToReplace = RGBtoHSL(0,255,1);//target color 
$hueAbsoluteError = 7;//the more the clearer 
$replacementColor = RGBtoHSL(0, 192, 239);//new color 
/* ---------------------------------------------- */ 

$filename = 'images/01.png'; 
$im = imagecreatefrompng($filename); 
$out = imagecreatetruecolor(imagesx($im), imagesy($im)); 
$transColor = imagecolorallocatealpha($out, 254, 254, 254, 127); 
imagefill($out, 0, 0, $transColor); 

for ($x = 0; $x < imagesx($im); $x++) { 
    for ($y = 0; $y < imagesy($im); $y++) { 
     $pixel = imagecolorat($im, $x, $y); 

     $red = ($pixel >> 16) & 0xFF; 
     $green = ($pixel >> 8) & 0xFF; 
     $blue = $pixel & 0xFF; 
     $alpha = ($pixel & 0x7F000000) >> 24; 

     $colorHSL = RGBtoHSL($red, $green, $blue); 

     if ((($colorHSL[0] >= $colorToReplace[0] - $hueAbsoluteError) && ($colorToReplace[0] + $hueAbsoluteError) >= $colorHSL[0])){ 
      $color = HSLtoRGB($replacementColor[0], $replacementColor[1], $colorHSL[2]); 
      $red = $color[0]; 
      $green= $color[1]; 
      $blue = $color[2]; 
     } 

     if ($alpha == 127) { 
      imagesetpixel($out, $x, $y, $transColor); 
     } 
     else { 
      imagesetpixel($out, $x, $y, imagecolorallocatealpha($out, $red, $green, $blue, $alpha)); 
     } 
    } 
} 
imagecolortransparent($out, $transColor); 
imagesavealpha($out, TRUE); 
header('Content-type: image/png'); 
imagepng($out); 
?> 

risposta

6

Si può solo leggere due immagini, fonte e lo sfondo, e prendere pixel immagine di sfondo da e impostare la fonte.

Di seguito è l'ultima parte del codice di cui sopra, che mostra questa idea:

$filename = 'images/01.png'; 
$bgFilename = 'images/background.png'; 
$im = imagecreatefrompng($filename); 
$bg = imagecreatefrompng($bgFilename); 
$out = imagecreatetruecolor(imagesx($im), imagesy($im)); 
$transColor = imagecolorallocatealpha($out, 254, 254, 254, 127); 
imagefill($out, 0, 0, $transColor); 

for ($x = 0; $x < imagesx($im); $x++) { 
    for ($y = 0; $y < imagesy($im); $y++) { 
     $pixel = imagecolorat($im, $x, $y); 
     $bgPixel = imagecolorat($bg, $x, $y); 

     $red = ($pixel >> 16) & 0xFF; 
     $green = ($pixel >> 8) & 0xFF; 
     $blue = $pixel & 0xFF; 
     $alpha = ($pixel & 0x7F000000) >> 24; 
     $colorHSL = RGBtoHSL($red, $green, $blue); 

     if ((($colorHSL[0] >= $colorToReplace[0] - $hueAbsoluteError) && ($colorToReplace[0] + $hueAbsoluteError) >= $colorHSL[0])){ 
      // Instead of taking the replacementColor 
      /* $color = HSLtoRGB($replacementColor[0], $replacementColor[1], $colorHSL[2]); */ 
      /* $red = $color[0]; */ 
      /* $green= $color[1]; */ 
      /* $blue = $color[2]; */ 
      // We just take colors from the backround image pixel 
      $red = ($bgPixel >> 16) & 0xFF; 
      $green = ($bgPixel >> 8) & 0xFF; 
      $blue = $bgPixel & 0xFF; 
     } 

     if ($alpha == 127) { 
      imagesetpixel($out, $x, $y, $transColor); 
     } 
     else { 
      imagesetpixel($out, $x, $y, imagecolorallocatealpha($out, $red, $green, $blue, $alpha)); 
     } 
    } 
} 
imagecolortransparent($out, $transColor); 
imagesavealpha($out, TRUE); 
header('Content-type: image/png'); 
imagepng($out); 

Il risultato può apparire così:

enter image description here

+0

Il risultato è un ottimo aspetto, ma ho ottenuto l'errore 500 sul mio server. Cosa c'è che non va? http://phuket.my/irp/ – Wilf

+1

@Wilf è necessario controllare i registri o eseguirne il debug in un altro modo, dall'errore 500 non è possibile dire qual è il problema. [Qui] (https://github.com/serebrov/so-questions/tree/master/php-image-background) è il codice completo che ho usato, scarica l'intera cartella o clona il repository, esegui come 'php convert. php> out.png', le immagini sorgente sono sotto 'images /'. –