2010-06-21 19 views
1

想象一下。我有一個像素的顏色(255,0,0)[紅色]。沒有人用白色和* alpha塗在它上面。我知道背景顏色,我知道它被塗上了什麼顏色,我需要獲得塗滿顏色的阿爾法。怎麼樣?PHP GD:需要找出一個阿爾法數量

到目前爲止,我們有:

$im = imagecreatefrompng('public/images/bg-tmp.png'); 

// we need to find a nearest match for this array in every pixel 
/*$colors = array(
    array(255, 255, 255, 100), 
    array(255, 255, 255, 75), 
    array(255, 255, 255, 50), 
array(255, 255, 255, 25), 
    array(255, 255, 255, 0), 
);*/ 

// finding out the pixel color 
$rgb = imagecolorat($im, 0, 6); 

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

var_dump($r, $g, $b); 

確定。所以我取得了進展。

$im = imagecreatefrompng('public/images/bg-tmp.png'); 

$pixels = array(); 

for($y = 0; $y < 24; $y++) 
{ 
for($x = 0; $x < 24; $x++) 
{ 
    $rgb = imagecolorat($im, $x, $y); 

//前三個RGB值是背景顏色 $像素[] =陣列($ X,$ Y,calc_alpha_diff(0,0,0,($ RGB >> 16)& 0xFF時,($ rgb >> 8)& 0xFF,$ rgb & 0xFF)); }}

function calc_alpha_diff($R1,$G1,$B1,$R2,$G2,$B2) 
{ 
$color_diff = max($R1,$R2) - min($R1,$R2) + max($G1,$G2) - min($G1,$G2) + max($B1,$B2) - min($B1,$B2); 

$array = array 
(
    100 => 510, // 1 
    75 => 382, // 0.75 
    50 => 256, // 0.5 
    25 => 128, // 0.25 
    0 => 0 // 0 
); 

// find the nearest value 
foreach($array as $key => $val) 
{ 
    $delta = abs($val - $color_diff); 

    if(!isset($min_delta) || $min_delta > $delta) 
    { 
    $min_delta = $delta; 
    $alpha = $key; 
    } 
} 

return $alpha; 
} 

$im = imagecreatetruecolor(24, 24); 

foreach($pixels as $p) 
{ 
if($p[2] != 0) 
{ 
    imagesetpixel($im, $p[0], $p[1], imagecolorallocatealpha($im, 255, 0, 0, $p[2])); 
} 
} 

// make image transperant 
imagecolortransparent($im, 0); 

imagepng($im); 
imagedestroy($im); 

header('Content-type: image/png'); 

exit; 

此代碼將爲您〜好成績。但是,還不夠好。請提出改進​​建議。

回答