2008-10-31 305 views

回答

10

简单地将灰度颜色舍入为黑色或白色。

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

绿色通道被认为比其他两个更亮,对于灰度级来说更好的方程是:0.299R + 0.587G + 0.114B – Null303 2008-10-31 20:16:13

+0

我们四舍五入成为纯黑色和纯白色,因此这些重量无关紧要:-) – 2008-10-31 20:22:50

+0

贾斯珀,它看起来确实很重要,因为您转换为黑色或白色是基于测试的阈值*灰色*值。 – 2012-04-08 23:41:59

6

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

+0

找到对应的命令行功能: 转换source.jpg -colors 2目的地.jpg – 2008-10-31 18:56:08

19

使用PHP gd库:

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

检查上面有更多的例子链接的用户评论。

0

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

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

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

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

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

该功能的工作就像一个魅力

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

} 
0

使用PHP GD库:

imagefilter($im, IMG_FILTER_GRAYSCALE); 
imagefilter($im, IMG_FILTER_CONTRAST, 1000);