【问题标题】:How do you convert an image to black and white in PHP如何在 PHP 中将图像转换为黑白
【发布时间】:2008-10-31 18:01:53
【问题描述】:

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

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

【问题讨论】:

    标签: php image imagefilter


    【解决方案1】:

    使用 php gd 库:

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

    查看以上链接中的用户 cmets 以获得更多示例。

    【讨论】:

    • 实际使用imagefilter($im, IMG_FILTER_CONTRAST, -1000);注意 1000 而不是 100
    • @Mark 你有参考或者知道它是否依赖于版本?虽然我发现有几个人说它是 -100 到 100,但我还没有在网上找到任何确定的地方。
    • 嗯,不确定,我没有 php 设置 atm 来测试它。
    • 我可以确认。需要是 -1000 而不是 -100
    【解决方案2】:

    只需将灰度颜色四舍五入为黑色或白色。

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

    【讨论】:

    • 绿色通道被认为比其他两个更亮,更好的灰度方程是:0.299R + 0.587G + 0.114B
    • 我们四舍五入到纯黑色和纯白色,所以这些重量不会那么重要:-)
    • Jasper,看起来它们确实很重要,因为您转换为黑色或白色是基于针对 gray 值测试的阈值。
    • 我的意思是,生成的图像不应该 /that/ 不同。显然它们会有所不同(并且添加的点积不会增加太多计算时间)。无论如何,权重几乎是任意的。无论如何请记住,我们对实际的亮度值并不真正感兴趣,只是对黑色或白色结果感兴趣。在这种情况下,这似乎是解决问题的最简单方法。如果您有兴趣(或想使这个问题进一步复杂化),请检查此选项; dcgi.felk.cvut.cz/home/cadikm/color_to_gray_evaluation
    • 请参阅en.wikipedia.org/wiki/…,了解每个颜色通道的系数来源。 PHP 的 imagefilterIMG_FILTER_GRAYSCALE,正如另一个答案中所建议的,自动执行此操作,因此您不必自己在 PHP 代码中操作每个像素。
    【解决方案3】:

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

    【讨论】:

    • 找一个命令行对应的函数:convert source.jpg -colors 2 destination.jpg
    【解决方案4】:

    如果您打算自己执行此操作,则需要实现 dithering algorithm。但正如@jonni 所说,使用现有工具会容易得多吗?

    【讨论】:

      【解决方案5】:
      $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;}
      

      【讨论】:

        【解决方案6】:

        这个功能就像一个魅力

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

        【讨论】:

          【解决方案7】:

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

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

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

          请注意,在 PHP 中执行此操作会非常慢 - 您将远远领先于找到提供此功能的库。

          【讨论】:

          • 用 PHP 做这些事情并没有那么慢,我已经用 PHP 完成了一个完整的图像编辑库,包括红眼消除、模糊滤镜、蒙版、混合滤镜等等,性能还不错。 (对于实时使用来说还不够,但对于大多数应用程序来说绝对足够快)。
          猜你喜欢
          • 1970-01-01
          • 2016-11-25
          • 2011-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-11
          • 2013-01-08
          相关资源
          最近更新 更多