如何在PHP中将图像转换为黑白?

不只是将其变成灰度,而是每个像素变成黑色或白色?

有帮助吗?

解决方案

只需将灰度颜色变为黑色或白色。

float gray = (r + g + b) / 3
if(gray > 0x7F) return 0xFF;
return 0x00;

其他提示

使用php gd 库:

imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -100);

查看上面链接中的用户评论以获取更多示例。

假设您的主机支持它,您可以使用imagemagick。您想用什么函数来判断像素应该是黑色还是白色?

如果您打算自己这样做,则需要实施抖动算法。但正如 @jonni 说,使用现有的工具会容易得多吗?

$rgb = imagecolorat($original, $x, $y);
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8 ) & 0xFF;
        $b = $rgb & 0xFF;

        $gray = $r + $g + $b/3;
        if ($gray >0xFF) {$grey = 0xFFFFFF;}
        else { $grey=0x000000;}

这个功能就像一个魅力

    public function ImageToBlackAndWhite($im) {

    for ($x = imagesx($im); $x--;) {
        for ($y = imagesy($im); $y--;) {
            $rgb = imagecolorat($im, $x, $y);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8 ) & 0xFF;
            $b = $rgb & 0xFF;
            $gray = ($r + $g + $b) / 3;
            if ($gray < 0xFF) {

                imagesetpixel($im, $x, $y, 0xFFFFFF);
            }else
                imagesetpixel($im, $x, $y, 0x000000);
        }
    }

    imagefilter($im, IMG_FILTER_NEGATE);

}

对于每个像素,您必须从颜色转换为灰度 - 类似于 $ gray = $ red * 0.299 + $ green * 0.587 + $ blue * 0.114; (这些是NTSC加权因子;存在其他类似的权重。这模仿了眼睛对不同颜色的不同反应性。)

然后你需要决定截止值 - 通常是最大像素值的一半,但根据图像你可能更喜欢更高的值(使图像更暗)或更低(使图像更亮)。

只是将每个像素与截止值进行比较会丢失很多细节 - 即大的黑暗区域会变成黑色 - 因此为了保留更多信息,您可以抖动。基本上,从图像的左上角开始:对于每个像素,在与截止值比较之前,为左侧和上方的像素添加误差(原始值和最终赋值之间的差值)。

请注意,在PHP中执行此操作会非常慢 - 您可以更进一步找到提供此功能的库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top