Image processing 在PHP中将上传的图像转换为灰度
我有一个脚本,可以上传图片并调整大小,这一切都很好,但我希望能够去除图片中的颜色,使其保持黑白(基本上是各种灰度)。我不知道该如何做到这一点Image processing 在PHP中将上传的图像转换为灰度,image-processing,Image Processing,我有一个脚本,可以上传图片并调整大小,这一切都很好,但我希望能够去除图片中的颜色,使其保持黑白(基本上是各种灰度)。我不知道该如何做到这一点 谢谢尝试以下几点: <?php $source_file = "test_image.jpg"; $im = ImageCreateFromJpeg($source_file); $imgw = imagesx($im); $imgh = imagesy($im); for ($i=0; $i<$imgw; $i++) {
谢谢尝试以下几点:
<?php
$source_file = "test_image.jpg";
$im = ImageCreateFromJpeg($source_file);
$imgw = imagesx($im);
$imgh = imagesy($im);
for ($i=0; $i<$imgw; $i++)
{
for ($j=0; $j<$imgh; $j++)
{
// get the rgb value for current pixel
$rgb = ImageColorAt($im, $i, $j);
// extract each value for r, g, b
$rr = ($rgb >> 16) & 0xFF;
$gg = ($rgb >> 8) & 0xFF;
$bb = $rgb & 0xFF;
// get the Value from the RGB value
$g = round(($rr + $gg + $bb) / 3);
// grayscale values have r=g=b=g
$val = imagecolorallocate($im, $g, $g, $g);
// set the gray value
imagesetpixel ($im, $i, $j, $val);
}
}
header('Content-type: image/jpeg');
imagejpeg($im);
?>
最简单的解决方案是使用imagefilter($im,IMG\u FILTER\u GRAYSCALE); 但这里提到的每一种方法都不是100%有效。所有这些都依赖于图像的调色板,但灰色的阴影可能会丢失,并使用调色板中的另一种颜色 我的解决方案是使用imagecolorset替换调色板中的颜色
$colorsCount = imagecolorstotal($img->getImageResource());
for($i=0;$i<$colorsCount;$i++){
$colors = imagecolorsforindex( $img->getImageResource() , $i );
$g = round(($colors['red'] + $colors['green'] + $colors['blue']) / 3);
imagecolorset($img->getImageResource(), $i, $g, $g, $g);
}
$colorsont=imagecolorstotal($img->getImageResource());
对于($i=0;$igetImageResource(),$i);
$g=圆形($colors['red']+$colors['green']+$colors['blue'])/3);
imagecolorset($img->getImageResource(),$i,$g,$g,$g);
}
最好使用命令工具转换此类图像。同时还支持动画gif
例如:
这是使用Naive颜色->灰度转换。人眼对绿色更敏感,因此更好的转换公式将使绿色成分的权重高于红色/蓝色。当然。我已经添加了
imagefilter
,它只适用于PHP5,我想(并希望)这一个使用了更复杂的方法。@yuri:-先生,我使用的是你上面的脚本,我收到了一个错误,我的图像无法显示,因为它包含错误。我认为这会产生问题(标题('Content-type:image/png');)@AnkurSaxena你确定源映像存在吗?尝试添加一些调试语句,或者在图像上使用view source:查看是否可以得到更具描述性的错误。
$colorsCount = imagecolorstotal($img->getImageResource());
for($i=0;$i<$colorsCount;$i++){
$colors = imagecolorsforindex( $img->getImageResource() , $i );
$g = round(($colors['red'] + $colors['green'] + $colors['blue']) / 3);
imagecolorset($img->getImageResource(), $i, $g, $g, $g);
}
$file = 'image.jpg';
$file = 'image.gif';
$file = 'image.png';
$image_type = getimagesize($file);
switch (strtolower($image_type['mime'])) {
case 'image/png':
exec("convert $file -colorspace Gray dummy.png");
break;
case 'image/jpeg':
exec("convert $file -colorspace Gray dummy.jpeg");
break;
case 'image/gif':
exec("convert $file -colorspace Gray dummy.gif");
break;
default:
die;
}