2011-11-08 152 views
0

好吧,我有一個64x64像素的圖像,一些像素是白色的,一些是灰色的,還有一些是較暗的,所以我有另一個64x64像素的圖像,一些黃色像素將決定第一個圖像的哪些像素必須改變。 到目前爲止,我可以使用以下代碼更改第一張圖片上的顏色,但是我不知道如何將給定的顏色與已經在第一張圖片上的顏色「混合」。例如,如果像素是白色(255,255,255)並且新顏色是紅色(255,0,0),則結果將是(255,0,0),但是如果像素有點暗,則新的紅色也應該更暗。有任何想法嗎?混合顏色GD - PHP

$image = 'o1.png'; 
$overlay = 'o2.png'; 

$background = imagecreatefrompng($image); 

imagealphablending($background, true); 

// Create overlay image 
$overlay = imagecreatefrompng($overlay); 

// get size 
$size = getimagesize("o2.png"); 
$L=$size[0]; 
$H=$size[1]; 

for($j=0;$j<$H;$j++){ 
    for($i=0;$i<$L;$i++){ 

     $rgb = imagecolorat($overlay, $i, $j); 

     $red = (isset($_GET['r']) ? $_GET['r'] : 0); 
     $green = (isset($_GET['g']) ? $_GET['g'] : 0); 
     $blue = (isset($_GET['b']) ? $_GET['b'] : 0); 

     $r = ($rgb >> 16) & 0xFF; 
     $g = ($rgb >> 8) & 0xFF; 
     $b = $rgb & 0xFF; 

     if(($r==255)&&($g==255)&&($b==0)) { 

      $color = imagecolorallocate($background, $red, $green, $blue); 
      imagesetpixel($background, $i, $j, $color); 

     } 

    } 
} 


header("Content-type: image/png"); 
header("Content-Disposition: filename=" . $image); 

imagepng($background); 

// Destroy the images 
imagedestroy($background); 
imagedestroy($overlay); 
+0

爲什麼不把一個alpha圖像合併到頂部? – Brad

+0

我試過了,但問題是我永遠不會得到正確的顏色,因爲它取決於透明度%,我希望某種代碼能夠「總結」兩種顏色並獲取顏色,具體取決於第一個原始像素圖片。如果透明度太低,則原始圖像的較暗部分不會被注意到,如果太高,則新的顏色(例如紅色)看起來更像橙色而不是紅色。 – user1036504

+0

是的,當然......這就是合併頂部的alpha圖像所能做到的。你的問題是什麼? – Brad

回答

2

我想你是在談論乘法混合模式。爲這個目的,根據Wikipedia的公式爲:

結果顏色=(頂部顏色)*(底部顏色)/ 255

使用這個公式所得到的圖像將會變暗其中背景顏色是暗。

+0

這正是我想要的,謝謝:) – user1036504

+1

它可能不明顯,但公式應分別應用於顏色(即紅色,綠色,藍色)的每個組件(因爲我認爲我需要乘以'0xFFFFFF '與0xFF3333'這是不一樣的艱難看起來有點相似) – baldrs