Page 1 of 1

PHP GD: need to find out an alpha quantity

Posted: Mon Jun 21, 2010 5:31 pm
by spamyboy
Imagine this. I have a pixel of color (255,0,0) [red]. No someone painted on it with white color with * alpha. I know the background color, I know with what color it was painted over, I need to get the alpha of the painted over color. How?

So far we have:

Code: Select all

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

Re: PHP GD: need to find out an alpha quantity

Posted: Mon Jun 21, 2010 7:13 pm
by spamyboy
I made a progress. Here is what I have now. However, the quality is very low. Advices please.

Code: Select all

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