Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 在PHP中将上传的图像转换为灰度_Image Processing - Fatal编程技术网

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