Я хочу найти доминирующий цвет в изображении, как я могу это сделать?
Было бы здорово, если бы я смог получить это в HEX-коде (exm: #eeeeee)
Я хочу найти доминирующий цвет в изображении, как я могу это сделать?
Было бы здорово, если бы я смог получить это в HEX-коде (exm: #eeeeee)
Чтобы найти наиболее "доминирующий" цвет в изображении, то есть цвет, который наиболее распространен в изображении: вам нужно создать гистограмму изображения.
Вот код из этой статьи о том, как создать гистограмму в 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
является вашим наиболее "доминирующим" цветом.
Существует разработанный класс PHP, который называется цветной экстракт. Однако знайте, что для этого на стороне сервера потребуются значительные системные ресурсы. Возможно, вы захотите сделать это с помощью холста.
Попробуйте следующее: http://www.coolphptools.com/color_extract.
Извлечение цвета изображения. Класс PHP извлекает наиболее распространенные цвета (в процентах) из файла изображения. Значения цвета находятся в шестнадцатеричном формате.
Звучит как восхитительный код для написания! Я сделал функцию некоторое время назад, которая проходит через каждый пиксель и добавляет оттенок каждому из них. Что вы можете сделать:
Для каждого пикселя найдите самый высокий цвет (r, g или b) и выполните математику ($ colorg++ или что-то еще)
в конце, узнайте, какой из них самый большой, и будет ваш самый высокий тень rgb.
Интересно, какой цвет выйдет, если вы используете полученное значение rgb...
Что касается ответа 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>
Кроме того, стоит упомянуть, что это просто самый "повторяющийся" цвет на изображении, который не может абсолютно считаться "доминирующим" цветом.
Вы должны посмотреть GD и функции изображения.
Существует аналогичный question, посвященный извлечению информации о цветах из изображения с помощью PHP, и он ссылается на этот класс в github.
🖼 Определить доминирующий цвет, используемый в изображении
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>';
}
Источник: https://github.com/gaffling/PHP-Simple-Color-Thief/
Хотя его в javascript, но color-thief лучше всего подходит для получения доминирующего цвета в изображении.