2016-01-22 173 views
12

另一個視頻中的特定RGB顏色我得出一個完美的色彩從https://stackoverflow.com/a/32710756/1620626更換的腳本。我想用圖像背景替換目標顏色。在原始圖像中背景與淺綠色(rgb:0b255b1)。我可以用藍色代替它,但我沒有一個想法如何用圖像來代替。這是腳本。替換使用PHP

這是原始圖像。 01.jpg

一旦我處理照片的腳本。我有這個。 enter image description here

該腳本完全替換了新的目標顏色。現在我想從藍色變爲背景。所以最後的想法是。這個女孩在我選擇的背景圖片上。

下面是代碼:

<?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); 
?> 

回答

6

你可以只是讀兩個圖像,來源和背景,以及背景圖片採取像素,並設置爲源。

下面是你的代碼的最後一部分,上述這說明這個道理:

$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); 

結果可能是這樣的:

enter image description here

+0

結果看起來棒極了,但我得到了錯誤500在我的服務器上。怎麼了? http://phuket.my/irp/ – Wilf

+1

@Wilf你需要檢查日誌或以其他方式進行調試,從500錯誤是不可能說出什麼問題。 [這裏](https://github.com/serebrov/so-questions/tree/master/php-image-background)是我使用的完整代碼,下載整個文件夾或克隆存儲庫,以'php convert'運行。 PHP> out.png',源圖像是下'圖像/'。 –