Convert non-transparent pixels to black
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 imagemagic开发者_高级运维k 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)
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.
Before
After
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);
}
}
I'm not sure whether it'll help you (i.e. whether the methods presented will leave the transparent pixels alone) but check out the answers to this question: PHP/ImageMagic Get the “shadow” of an image
精彩评论