开发者

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.

  1. -alpha extract - Take the alpha mask of the image. Completely transparent pixels will be black, completely opaque ones white.
  2. -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.
  3. -negate - Invert the image. Now our blacks are white and our whites are black.
  4. -transparent white - Set white pixels to be transparent. This can be excluded if you'd prefer your originally transparent pixels to be white.

Before

Convert non-transparent pixels to black

After

Convert non-transparent pixels to black


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜