我想找到图像中的主色, 我怎么能这样做?
如果我能用十六进制代码(exm:#eeeeee)
,那就太棒了答案 0 :(得分:16)
找到最多的"显而易见的"图像中的颜色,意味着图像中最常见的颜色:您需要创建图像的直方图。
以下是此article on how to create a histogram in PHP的代码。 (网站已多次下线)
<?php
$source_file = "test_image.jpg";
// histogram options
$maxheight = 300;
$barwidth = 2;
$im = ImageCreateFromJpeg($source_file);
$imgw = imagesx($im);
$imgh = imagesy($im);
// n = total number or pixels
$n = $imgw*$imgh;
$histo = array();
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
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
// get the Value from the RGB value
$V = round(($r + $g + $b) / 3);
// add the point to the histogram
$histo[$V] += $V / $n;
}
}
// find the maximum in the histogram in order to display a normated graph
$max = 0;
for ($i=0; $i<255; $i++)
{
if ($histo[$i] > $max)
{
$max = $histo[$i];
}
}
echo "<div style='width: ".(256*$barwidth)."px; border: 1px solid'>";
for ($i=0; $i<255; $i++)
{
$val += $histo[$i];
$h = ( $histo[$i]/$max )*$maxheight;
echo "<img src=\"img.gif\" width=\"".$barwidth."\"
height=\"".$h."\" border=\"0\">";
}
echo "</div>";
?>
在该示例中,$max
是您最具优势的&#34;颜色。
答案 1 :(得分:3)
开发了一个处理此类的PHP类,名为color extract。但是,要知道在服务器端执行此操作将需要大量系统资源。您可能希望使用canvas执行此操作。
答案 2 :(得分:3)
试试这个:http://www.coolphptools.com/color_extract。
图像颜色提取PHP类从图像文件中提取最常见的颜色(百分比)。颜色值以十六进制表示。
答案 3 :(得分:2)
听起来像一个令人愉快的代码!我做了一段时间的功能,通过每个像素,并为每个像素添加阴影。你能做的是:
对于每个像素,找到最高颜色(r,g或b)并进行数学运算($ colorG ++或其他)
最后,找出最大的一个,并且会有最高的rgb阴影。
我想知道如果你使用得到的rgb值会出现什么颜色......
答案 4 :(得分:2)
关于tkone答案,$ max只是一个显示图像颜色密度的参数。我会稍微更改代码以返回HEX颜色:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Empty Document</title>
</head>
<body>
<?php
error_reporting(0);
function rgb2hex($rgb) {
$hex = "#";
$hex .= str_pad(dechex($rgb[0]), 2, "0", STR_PAD_LEFT);
$hex .= str_pad(dechex($rgb[1]), 2, "0", STR_PAD_LEFT);
$hex .= str_pad(dechex($rgb[2]), 2, "0", STR_PAD_LEFT);
return $hex; // returns the hex value including the number sign (#)
}
$source_file = "image.jpg";
// histogram options
$maxheight = 300;
$barwidth = 2;
$im = ImageCreateFromJpeg($source_file);
$imgw = imagesx($im);
$imgh = imagesy($im);
// n = total number or pixels
$n = $imgw*$imgh;
$histo = array();
for ($i=0; $i<$imgw; $i++)
{
for ($j=0; $j<$imgh; $j++)
{
// get the rgb value for current pixel
$rgb = ImageColorAt($im, $i, $j);
//echo $rgb."<br>";
// extract each value for r, g, b
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
// get the Value from the RGB value
$V = round(($r + $g + $b) / 3);
//echo $V."<br>";
// add the point to the histogram
$histo[$V] += $V / $n;
$histo_color[$V] = rgb2hex([$r,$g,$b]);
}
}
// find the maximum in the histogram in order to display a normated graph
$max = 0;
for ($i=0; $i<255; $i++)
{
if ($histo[$i] > $max)
{
$max = $histo[$i];
}
}
echo "<div style='width: ".(256*$barwidth)."px; border: 1px solid'>";
for ($i=0; $i<255; $i++)
{
$val += $histo[$i];
$h = ( $histo[$i]/$max )*$maxheight;
echo "<img src=\"img.gif\" width=\"".$barwidth."\"
height=\"".$h."\" border=\"0\">";
}
echo "</div>";
$key = array_search ($max, $histo);
$col = $histo_color[$key];
?>
<p style="min-width:100px; min-height:100px; background-color:<?php echo $col?>;"></p>
<img src="<?php echo $source_file?>">
</body>
</html>
另外,值得一提的是,这只是最重复的&#39;图像上的颜色,不能完全考虑&#39;显性&#39;颜色。
答案 5 :(得分:0)
您应该查看GD and Image Functions。
答案 6 :(得分:0)
?检测图像中使用的主要颜色
PHP:
require 'color.php';
$image = 'https://cdn.pixabay.com/photo/2012/11/24/07/43/colorful-67134_960_720.jpg'
$default_color = 'ffffff';
echo simple_color_thief($image, $default_color);
将返回十六进制颜色:e0a654
color.php 文件:
/*
PHP Simple Color Thief
======================
Detect the Dominant Color used in an Image
Copyright 2019 Igor Gaffling
*/
function simple_color_thief($img, $default='eee') {
if(@exif_imagetype($img)) { // CHECK IF IT IS AN IMAGE
$type = getimagesize($img)[2]; // GET TYPE
if ($type === 1) { // GIF
$image = imagecreatefromgif($img);
// IF IMAGE IS TRANSPARENT (alpha=127) RETURN fff FOR WHITE
if (imagecolorsforindex($image, imagecolorstotal($image)-1)['alpha'] == 127) return 'fff';
} else if ($type === 2) { // JPG
$image = imagecreatefromjpeg($img);
} else if ($type === 3) { // PNG
$image = imagecreatefrompng($img);
// IF IMAGE IS TRANSPARENT (alpha=127) RETURN fff FOR WHITE
if ((imagecolorat($image, 0, 0) >> 24) & 0x7F === 127) return 'fff';
} else { // NO CORRECT IMAGE TYPE (GIF, JPG or PNG)
return $default;
}
} else { // NOT AN IMAGE
return $default;
}
$newImg = imagecreatetruecolor(1, 1); // FIND DOMINANT COLOR
imagecopyresampled($newImg, $image, 0,0,0,0,1,1, imagesx($image), imagesy($image));
return dechex(imagecolorat($newImg, 0, 0)); // RETURN HEX COLOR
}
// DEMO
foreach(glob('./*.{jpg,png,gif}', GLOB_BRACE) as $i) {
echo '<div style="width:26%;padding:50px;background:#'.
simple_color_thief($i,'f00').
';display:inline-block"><img style="height:200px" src="'.
$i.'"></div>';
}
答案 7 :(得分:0)
您将图像资源用作参数。
例如:
$im=imagecreatefromjpeg("path/to/image");
getDominantcolor($im);
NB:此功能将稍微降低您的页面速度,因为它将图像的每种颜色与所有其他颜色进行比较以进行统计。 返回主色的rgb值作为数组
function getDominantcolor($im){
$width=imagesx($im);
$height=imagesy($im);
$colorArr=[];
$comparArr=[];
$colCount=0;
//fixed height
for ($j=0; $j < $height; $j++) {
//fetching color on widths
for ($i=0; $i < $height; $i++) {
$colorArr[]=imagecolorat ( $im ,$i ,$j );
}
}
//fixed height
for ($col=0; $col < count($colorArr); $col++) {
for ($cel=0; $cel < count($colorArr); $cel++) {
if($colorArr[$col]===$colorArr[$cel]){
$colCount+=1;
}
}
$comparArr[]=$colCount;
$colCount=0;
}
foreach ($comparArr as $key => $value) {
if($value===max($comparArr)){
$max_index=$key;
break;
}
}
$rgb=$colorArr[$max_index];
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
return ['r'=>$r,'g'=>$g,'b'=>$b];
}
答案 8 :(得分:-3)
虽然它在javascript中但color-thief最适合在图像中获得主色。