【发布时间】:2008-10-31 18:01:53
【问题描述】:
如何在 PHP 中将图像转换为黑白?
不只是把它变成灰度,而是把每个像素变成黑色或白色?
【问题讨论】:
标签: php image imagefilter
如何在 PHP 中将图像转换为黑白?
不只是把它变成灰度,而是把每个像素变成黑色或白色?
【问题讨论】:
标签: php image imagefilter
使用 php gd 库:
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -100);
查看以上链接中的用户 cmets 以获得更多示例。
【讨论】:
-1000 而不是 -100。
只需将灰度颜色四舍五入为黑色或白色。
float gray = (r + g + b) / 3
if(gray > 0x7F) return 0xFF;
return 0x00;
【讨论】:
imagefilter 和 IMG_FILTER_GRAYSCALE,正如另一个答案中所建议的,自动执行此操作,因此您不必自己在 PHP 代码中操作每个像素。
假设您的主机支持它,您可以使用 imagemagick。你想用什么函数来决定一个像素应该是黑色还是白色?
【讨论】:
如果您打算自己执行此操作,则需要实现 dithering algorithm。但正如@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 中执行此操作会非常慢 - 您将远远领先于找到提供此功能的库。
【讨论】: