2010-06-21 7 views
1

Imaginez ceci. J'ai un pixel de couleur (255,0,0) [rouge]. Personne ne peint dessus avec une couleur blanche avec * alpha. Je connais la couleur de fond, je sais avec quelle couleur elle a été peinte, j'ai besoin d'obtenir l'alpha de la couleur peinte. Comment?PHP GD: besoin de connaître une quantité alpha

Jusqu'ici, nous avons:

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

Ok. Donc je fais un progrès.

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

// trois premières valeurs RVB des couleurs de fond $ pixels [] = array ($ 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; 

Ce code vous fournira un ~ bon résultat. Cependant, pas assez bon. S'il vous plaît suggérer des améliorations.

Répondre