将非透明像素转换为黑色。

7

我正在寻找一种将图像转换为所有非透明像素(即alpha!= 1的像素)变为黑色,并保留或转换为白色的透明像素的方法。 我使用了下面的ImageMagick命令,但效果不是很理想:

convert <img> -colorspace Gray <out>

然而,这仍然给我一些灰色而不是完全的黑色。我尝试了所有颜色空间选项,但没有一个可以完成任务。
有什么想法可以使用ImageMagick或类似的工具(或者如果存在的话,使用PHP库)来实现这个目标?
3个回答

27

我知道这个问题很旧了,但是现在我碰巧看到了它,那么我就来回答一下。

你需要的ImageMagick命令是:

convert <img> -alpha extract -threshold 0 -negate -transparent white <out>
我会详细解释它的作用。
  1. -alpha extract - 获取图像的 alpha 通道掩模。完全透明的像素将变为黑色,完全不透明的像素将变为白色。
  2. -threshold 0 - 如果通道值大于零,则将所有通道的值增加到它们的最大值。在这种情况下,它会将每个像素都变为白色,除了那些完全黑色的像素
  3. -negate - 反转图像。现在我们的黑色变为白色,我们的白色变为黑色。
  4. -transparent white - 将白色像素设置为透明。如果您希望最初透明的像素是白色,则可以将此选项排除在外。

Before

PNG image with alpha channel

After

Previous image after running the convert command


2

好的,你可以使用GD和一对循环来完成:

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

或者,您可以更改颜色(这可能有效,也可能无效):
$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);
    }
}

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接