Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.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
PHP如何检测图像是否包含颜色?_Php_Colors - Fatal编程技术网

PHP如何检测图像是否包含颜色?

PHP如何检测图像是否包含颜色?,php,colors,Php,Colors,我正在写一个图像搜索引擎,它允许用户按颜色搜索。作为其中的一部分,我需要确定图像是灰度(仅包含黑色、白色或灰色阴影)还是包含任何颜色 如何检测图像是否包含除黑色、白色和灰色之外的任何像素?您必须使用(参见示例2)遍历每个像素 灰度颜色的红、绿和蓝的值相同。如果你发现一个像素的值不同,那么它就是一个包含颜色的图像(至少从技术上来说,像RGB(100102103)这样的颜色在人眼看来是灰色的。)。你必须使用(参见示例2)遍历每个像素. 灰度颜色对于红色、绿色和蓝色具有相同的值。如果你发现一个像素的

我正在写一个图像搜索引擎,它允许用户按颜色搜索。作为其中的一部分,我需要确定图像是灰度(仅包含黑色、白色或灰色阴影)还是包含任何颜色


如何检测图像是否包含除黑色、白色和灰色之外的任何像素?

您必须使用(参见示例2)遍历每个像素


灰度颜色的红、绿和蓝的值相同。如果你发现一个像素的值不同,那么它就是一个包含颜色的图像(至少从技术上来说,像
RGB(100102103)
这样的颜色在人眼看来是灰色的。)。

你必须使用(参见示例2)遍历每个像素.


灰度颜色对于红色、绿色和蓝色具有相同的值。如果你发现一个像素的值不同,那么它就是一个包含颜色的图像(至少从技术上讲,对于像
RGB(100102103)
这样的颜色,人眼会觉得它是灰色的。).

根据服务器上安装的光栅图像套件,您可以使用这些工具获得比Pekka在此提供的更简单、更准确的答案。这是否更快是一个开放的参数(见下面的注释)

在下面的ImageMagick示例(和链接)中,建议:

将图像转换为HSL,然后输出详细信息 (“识别”统计数据)

分析冗长的信息可以为你的问题提供答案;因此,精确、简单,无需对“接近”的灰色图像进行猜测。它还提供您可能能够使用的其他数据,具体取决于您的工作流程和需要

资料来源:

我怀疑这比Pekka的解决方案快,因为无论如何,转换图像基本上会在像素之间循环


所以,佩卡对速度的回答。这是对精度的回答。

根据服务器上安装的光栅图像套件,您可以使用这些工具获得比Pekka在此提供的更简单、更准确的答案。这是否更快是一个开放的参数(见下面的注释)

在下面的ImageMagick示例(和链接)中,建议:

将图像转换为HSL,然后输出详细信息 (“识别”统计数据)

分析冗长的信息可以为你的问题提供答案;因此,精确、简单,无需对“接近”的灰色图像进行猜测。它还提供您可能能够使用的其他数据,具体取决于您的工作流程和需要

资料来源:

我怀疑这比Pekka的解决方案快,因为无论如何,转换图像基本上会在像素之间循环


所以,佩卡对速度的回答。这是对精度的回答。

我建议使用以下函数。它的工作方式只是找到以像素为单位的R-G-B值的相似性。如果只有一个像素的RGB值不同,则可能是彩色图像。但是,建议插入
resize\u upload()
函数以节省时间

function detect_greyscale($source_file)
{
    $im = resize_uploaded($source_file);    
    $imgw = imagesx($im);
    $imgh = imagesy($im);

    $count_grey = '';
    $count_color = '';

    for ($i=0; $i<$imgw; $i++)
    {
        for ($j=0; $j<$imgh; $j++)
        {
            $rgb = ImageColorAt($im, $i, $j); 
            $rr = ($rgb >> 16) & 0xFF;
            $gg = ($rgb >> 8) & 0xFF;
            $bb = $rgb & 0xFF;
            if($rr == $gg and $rr == $bb and $bb == $gg)
            {
                $count_grey++;
            }
            else
            {
                $count_color++;
            }
        }
    }
    imagedestroy($im);
    if($count_color>0)
    {
        return 0;
    }
    return 1;
}
函数检测灰度($source\u文件)
{
$im=调整上传的文件大小($source\u文件);
$imgw=imagesx($im);
$imgh=imagesy($im);
$count_grey='';
$count_color='';
对于($i=0;$i 16)&0xFF;
$gg=($rgb>>8)和0xFF;
$bb=$rgb&0xFF;
如果($rr==$gg和$rr==$bb和$bb==$gg)
{
$count_grey++;
}
其他的
{
$count_color++;
}
}
}
图像处理(港币);;
如果($count\u color>0)
{
返回0;
}
返回1;
}

我建议使用以下功能。它的工作方式只是找到以像素为单位的R-G-B值的相似性。如果只有一个像素的RGB值不同,则可能是彩色图像。但是,建议插入
resize\u upload()
函数以节省时间

function detect_greyscale($source_file)
{
    $im = resize_uploaded($source_file);    
    $imgw = imagesx($im);
    $imgh = imagesy($im);

    $count_grey = '';
    $count_color = '';

    for ($i=0; $i<$imgw; $i++)
    {
        for ($j=0; $j<$imgh; $j++)
        {
            $rgb = ImageColorAt($im, $i, $j); 
            $rr = ($rgb >> 16) & 0xFF;
            $gg = ($rgb >> 8) & 0xFF;
            $bb = $rgb & 0xFF;
            if($rr == $gg and $rr == $bb and $bb == $gg)
            {
                $count_grey++;
            }
            else
            {
                $count_color++;
            }
        }
    }
    imagedestroy($im);
    if($count_color>0)
    {
        return 0;
    }
    return 1;
}
函数检测灰度($source\u文件)
{
$im=调整上传的文件大小($source\u文件);
$imgw=imagesx($im);
$imgh=imagesy($im);
$count_grey='';
$count_color='';
对于($i=0;$i 16)&0xFF;
$gg=($rgb>>8)和0xFF;
$bb=$rgb&0xFF;
如果($rr==$gg和$rr==$bb和$bb==$gg)
{
$count_grey++;
}
其他的
{
$count_color++;
}
}
}
图像处理(港币);;
如果($count\u color>0)
{
返回0;
}
返回1;
}

因此,循环检查每个像素并使用该功能检查每个像素?我认为,只要使用Pekka的方法找到一个彩色像素,您就可以停止。这将加快进程,因为它可能是第一个像素!或者,你可以调整图像的大小,或者只是选择一个区域进行检查。因此,循环检查每个像素并使用该功能进行检查?我认为,只要你使用Pekka的方法找到一个彩色像素,你就可以停止。这将加快进程,因为它可能是第一个像素!或者,您可以调整图像大小,或者只选择要检查的区域