I'm looking for a way of converting an image so that all non-transparent pixels (those that have alpha != 1) into black and transparent pixels untouched (or converted to white). The closest I got was with the below imagemagick command:
convert <img> -colorspace Gray <out>
However this still gives me some gray colors instead of a complete black. I have tried all colorspace options and none does the job.
Any idea how I could achieve this with imagemagick or with similar tools (or with a PHP library if it exists)
In the Layers panel, Ctrl+click (or, if on mac Cmd+click ) the layer thumbnail to turn its transparency into a selection. Use Select > Edit in Quick Mask Mode to enter Quick Mask Mode. Use Image > Adjustments > Threshold and set the Threshold to 255, to remove all transparent pixels.
Transparent pixels This image has binary transparency (some pixels fully transparent, other pixels fully opaque). It can be transparent against any background because it is monochrome.
I know this question is old, but now I've stumbled on it I might as well answer it.
The ImageMagick command you want is:
convert <img> -alpha extract -threshold 0 -negate -transparent white <out>
I'll breakdown what it's doing as well.
-alpha extract
- Take the alpha mask of the image. Completely transparent pixels will be black, completely opaque ones white.-threshold 0
- Increase all channels to their maximum value if they are greater than zero. In this case, it will make every pixel white except the ones that are completely black.-negate
- Invert the image. Now our blacks are white and our whites are black.-transparent white
- Set white pixels to be transparent. This can be excluded if you'd prefer your originally transparent pixels to be white.Well, you could do it with GD and a pair of loops:
$img = imagecreatefromstring(file_get_contents($imgFile));
$width = imagesx($img);
$hieght = imagesy($img);
$black = imagecolorallocate($img, 0, 0, 0);
$white = imagecolorallocate($img, 255, 255, 255);
for ($x = 0; $x < $width; $x++) {
for ($y = 0; $y < $width; $y++) {
$color = imagecolorat($img, $x, $y);
$color = imagecolorforindex($color);
if ($color['alpha'] == 1) {
imagesetpixel($img, $x, $y, $black);
} else {
imagesetpixel($img, $x, $y, $white);
}
}
}
Or, you could replace colors (this may or may not work):
$img = imagecreatefromstring(file_get_contents($imgFile));
$maxcolors = imagecolorstotal($img);
for ($i = 1; $i <= $maxcolors; $i++) {
$color = imagecolorforindex($i);
if ($color['alpha'] == 1) {
imagecolorset($img, $i, 0, 0, 0);
} else {
imagecolorset($img, $i, 255, 255, 255);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With