将非透明像素转换为黑色

时间:2010-08-06 17:10:09

标签: php image-processing imagemagick

我正在寻找一种转换图像的方法,以便所有非透明像素(具有alpha!= 1的像素)变为黑色和透明像素不变(或转换为白色)。我得到的最接近的是下面的imagemagick命令:

convert <img> -colorspace Gray <out>

然而,这仍然给我一些灰色而不是完整的黑色。我已经尝试了所有颜色空间选项,但没有一个能完成这项任务。

我知道如何使用imagemagick或类似的工具(或者如果它存在的话,使用PHP库)来实现这一目标

3 个答案:

答案 0 :(得分:22)

我知道这个问题已经过时了,但现在我偶然发现了它,我不妨回答它。

您想要的ImageMagick命令是:

convert <img> -alpha extract -threshold 0 -negate -transparent white <out>

我会分解它正在做的事情。

  1. -alpha extract - 获取图片的alpha掩码。完全透明的像素将是黑色,完全不透明的像素是白色。
  2. -threshold 0 - 如果所有频道大于零,则将其增加到最大值。在这种情况下,它会使每个像素都是白色的,除了完全黑色的
  3. -negate - 反转图片。现在我们的黑人是白人,我们的白人是黑人。
  4. -transparent white - 将白色像素设置为透明。如果您希望最初的透明像素为白色,则可以排除此项。
  5. 之前

    PNG image with alpha channel

    之后

    Previous image after running the convert command

答案 1 :(得分:1)

我不确定它是否对您有所帮助(即所提供的方法是否会单独留下透明像素),但请查看此问题的答案:PHP/ImageMagic Get the “shadow” of an image

答案 2 :(得分:1)

嗯,你可以用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);
    }
}
相关问题