How to isolate only one colour on image with PHP?
Question
Is it possible to leave (isolate) only one colour in image? Currently I'm interested in green:005d00
Solution
Well you can do it using ImageMagick via the command line:
convert original.png -matte ( +clone -fuzz 1 -transparent #005d00 ) -compose DstOut -composite isolated.png
The -fuzz command can take a percentage variance from the colour, if it's specific, drop the fuzz.
The () brackets need escaping in bash shell \( \), etc.
OTHER TIPS
You could use gd's imagecolorat()
function.
Just iterate over every pixel, check if it is the color you want, otherwise set it to black or white or whatever you want to do with it.
Here's a working example:
function colorEquals($rgb_color, $hex_color)
{
$r = ($rgb_color >> 16) & 0xFF;
$g = ($rgb_color >> 8) & 0xFF;
$b = $rgb_color & 0xFF;
list($hr, $hg, $hb) = sscanf($hex_color, '%2s%2s%2s');
$hr = hexdec($hr);
$hg = hexdec($hg);
$hb = hexdec($hb);
return $r == $hr && $g == $hg && $b == $hb;
}
$width = 300;
$height = 300;
// create 300x300 image
$img = imagecreatetruecolor($width, $height);
// fill grey
$color = imagecolorallocate($img, 127, 127, 127);
imagefill($img, 0, 0, $color);
// set a square of pixels to 005d00
$your_color = imagecolorallocate($img, 0, 93, 0);
imagefilledrectangle($img, 10, 10, 100, 100, $your_color);
$white = imagecolorallocate($img, 255, 255, 255);
for($x = 0; $x < $width; ++$x)
{
for($y = 0; $y < $height; ++$y)
{
$color = imagecolorat($img, $x, $y);
if(!colorEquals($color, '005d00'))
{
// set it to white
imagesetpixel($img, $x, $y, $white);
}
}
}
// output
header('Content-type: image/png');
imagepng($img);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow