質問
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);
}
ピクセルごとに、カラーからグレースケールに変換する必要があります- $ grey = $ red * 0.299 + $ green * 0.587 + $ blue * 0.114; (これらはNTSCの重み係数です。他の同様の重みが存在します。これは、異なる色に対する目の変化する反応を模倣します。)
次に、カットオフ値を決定する必要があります-通常は最大ピクセル値の半分ですが、画像によっては、より高い値(画像を暗くする)または低くする(画像を明るくする)こともできます。
各ピクセルをカットオフと比較すると、多くの詳細が失われます(つまり、大きな暗い領域が完全に黒くなります)。したがって、より多くの情報を保持するために、ディザリングできます。基本的に、画像の左上から開始します。各ピクセルについて、カットオフ値と比較する前に、左と上のピクセルの誤差(元の値と最終割り当て値の差)を追加します。
PHPでこれを行うのは非常に遅いことに注意してください-これを提供するライブラリを見つけるためには、はるかに先になるでしょう。