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


PHP how to detect if image contains color?

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

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

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

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

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

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

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

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

来源:http://www.imagemagick.org/discourse-server/viewtopic.php?t=19580

我怀疑这是否比Pekka的解决方案快,因为转换图像本质上会在像素之间循环。

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

我提出了以下函数。它的工作方式只是找到像素中R-G-B值的相似性。如果只有一个像素的RGB值不同,那么它可能是彩色图像。但是,建议插入resize_uploaded()函数以节省时间。

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