gpt4 book ai didi

php - 使用 PHP 检测图像中的主要颜色

转载 作者:IT王子 更新时间:2023-10-29 01:10:13 28 4
gpt4 key购买 nike

我正在尝试复制 Dribbble.com 检测图像中主要颜色的功能。在下图中,您可以看到来自 Dribbble.com 的屏幕截图,其中显示了左侧图像中的 8 种主要颜色。这是图像中的实际页面 http://dribbble.com/shots/528033-Fresh-Easy?list=following

我需要能够在 PHP 中执行此操作,一旦我获得所需的颜色,我会将它们保存到数据库中,这样就不需要在每次加载页面时都运行处理。

在对如何从图像中提取这些颜色进行一些研究后,有人说您只需逐个像素地检查图像,然后保存出现次数最多的颜色。其他人说还有更多,获得最常见的颜色不会产生预期的效果。他们说您需要量化图像/颜色(此时我迷路了)。

在下面的 Dribble 截图中,是一个 Javascript 库,可以做同样的事情,可以在这里查看该页面 http://lokeshdhakar.com/projects/color-thief/

查看该页面的源代码,我可以看到有一个名为 quantize.js 的 Javascript 文件,结果非常好。所以我希望能够使用 PHP 和 GD/ImageMagick 做 Javascript 库所做的事情

enter image description here


我发现这个函数会返回颜色并用 PHP 在图像中计数,但结果与上面的 Javascript 版本和 Dribble 结果不同

/**
* Returns the colors of the image in an array, ordered in descending order, where the keys are the colors, and the values are the count of the color.
*
* @return array
*/
function Get_Color()
{
if (isset($this->image))
{
$PREVIEW_WIDTH = 150; //WE HAVE TO RESIZE THE IMAGE, BECAUSE WE ONLY NEED THE MOST SIGNIFICANT COLORS.
$PREVIEW_HEIGHT = 150;
$size = GetImageSize($this->image);
$scale=1;
if ($size[0]>0)
$scale = min($PREVIEW_WIDTH/$size[0], $PREVIEW_HEIGHT/$size[1]);
if ($scale < 1)
{
$width = floor($scale*$size[0]);
$height = floor($scale*$size[1]);
}
else
{
$width = $size[0];
$height = $size[1];
}
$image_resized = imagecreatetruecolor($width, $height);
if ($size[2]==1)
$image_orig=imagecreatefromgif($this->image);
if ($size[2]==2)
$image_orig=imagecreatefromjpeg($this->image);
if ($size[2]==3)
$image_orig=imagecreatefrompng($this->image);
imagecopyresampled($image_resized, $image_orig, 0, 0, 0, 0, $width, $height, $size[0], $size[1]); //WE NEED NEAREST NEIGHBOR RESIZING, BECAUSE IT DOESN'T ALTER THE COLORS
$im = $image_resized;
$imgWidth = imagesx($im);
$imgHeight = imagesy($im);
for ($y=0; $y < $imgHeight; $y++)
{
for ($x=0; $x < $imgWidth; $x++)
{
$index = imagecolorat($im,$x,$y);
$Colors = imagecolorsforindex($im,$index);
$Colors['red']=intval((($Colors['red'])+15)/32)*32; //ROUND THE COLORS, TO REDUCE THE NUMBER OF COLORS, SO THE WON'T BE ANY NEARLY DUPLICATE COLORS!
$Colors['green']=intval((($Colors['green'])+15)/32)*32;
$Colors['blue']=intval((($Colors['blue'])+15)/32)*32;
if ($Colors['red']>=256)
$Colors['red']=240;
if ($Colors['green']>=256)
$Colors['green']=240;
if ($Colors['blue']>=256)
$Colors['blue']=240;
$hexarray[]=substr("0".dechex($Colors['red']),-2).substr("0".dechex($Colors['green']),-2).substr("0".dechex($Colors['blue']),-2);
}
}
$hexarray=array_count_values($hexarray);
natsort($hexarray);
$hexarray=array_reverse($hexarray,true);
return $hexarray;

}
else die("You must enter a filename! (\$image parameter)");
}

所以我想问是否有人知道我如何使用 PHP 完成这样的任务?可能已经存在你知道的东西或者任何让我更接近这样做的提示将不胜感激

最佳答案

这正是您在 PHP 中寻找的内容:https://github.com/thephpleague/color-extractor

例子:

use League\ColorExtractor\Palette;

$palette = Palette::fromFilename('some/image.png');

$topEightColors = $palette->getMostUsedColors(8);

关于php - 使用 PHP 检测图像中的主要颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10290259/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com