我正在寻找一种将图像转换为所有非透明像素(即alpha!= 1的像素)变为黑色,并保留或转换为白色的透明像素的方法。 我使用了下面的ImageMagick命令,但效果不是很理想:
convert <img> -colorspace Gray <out>
然而,这仍然给我一些灰色而不是完全的黑色。我尝试了所有颜色空间选项,但没有一个可以完成任务。
有什么想法可以使用ImageMagick或类似的工具(或者如果存在的话,使用PHP库)来实现这个目标?
我正在寻找一种将图像转换为所有非透明像素(即alpha!= 1的像素)变为黑色,并保留或转换为白色的透明像素的方法。 我使用了下面的ImageMagick命令,但效果不是很理想:
convert <img> -colorspace Gray <out>
我知道这个问题很旧了,但是现在我碰巧看到了它,那么我就来回答一下。
你需要的ImageMagick命令是:
convert <img> -alpha extract -threshold 0 -negate -transparent white <out>
我会详细解释它的作用。
-alpha extract
- 获取图像的 alpha 通道掩模。完全透明的像素将变为黑色,完全不透明的像素将变为白色。-threshold 0
- 如果通道值大于零,则将所有通道的值增加到它们的最大值。在这种情况下,它会将每个像素都变为白色,除了那些完全黑色的像素。-negate
- 反转图像。现在我们的黑色变为白色,我们的白色变为黑色。-transparent white
- 将白色像素设置为透明。如果您希望最初透明的像素是白色,则可以将此选项排除在外。好的,你可以使用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);
}
}