2008-10-31 126 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); 
相關問題