Вопрос:

Как найти Доминантный цвет на изображении?

php

31911 просмотра

8 ответа

348 Репутация автора

я хочу найти доминирующий цвет на изображении, как я могу это сделать?

было бы здорово, если бы я мог получить это в HEX-коде (exm: #eeeeee)

Автор: motioz Источник Размещён: 04.01.2012 04:54

Ответы (8)


3 плюса

3143 Репутация автора

Разработан класс PHP, который обрабатывает это, называется извлечение цвета . Однако знайте, что выполнение этого на стороне сервера потребует значительных системных ресурсов. Вы можете вместо этого сделать это с помощью canvas .

Автор: Zachary Schuessler Размещён: 04.01.2012 05:01

16 плюса

15054 Репутация автора

Решение

Чтобы найти наиболее «доминирующий» цвет на изображении, то есть цвет, который наиболее распространен на изображении: вам нужно создать гистограмму изображения.

Вот код из этой статьи о том, как создать гистограмму в 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ваш самый «доминирующий» цвет.

Автор: tkone Размещён: 04.01.2012 05:01

0 плюса

2830 Репутация автора

Вы должны взглянуть на GD и функции изображения .

Аналогичный вопрос на SO о извлечении информации о цвете из изображения с помощью PHP, и он ссылается на этот класс на github.

Автор: afaf12 Размещён: 04.01.2012 05:05

2 плюса

1596 Репутация автора

Звучит как восхитительный код для написания! Некоторое время назад я сделал функцию, которая проходит через каждый пиксель и добавляет тень к каждому. Что вы могли бы сделать, это:

Для каждого пикселя найдите самый высокий цвет (r, g или b) и сделайте математику ($ colorG ++ или что-то еще)

в конце выясните, какой из них самый большой, и будет ваш самый высокий оттенок RGB.

Интересно, какой цвет получился бы, если бы вы использовали полученное значение RGB ...

Автор: Adam F Размещён: 05.01.2012 01:57

3 плюса

31 Репутация автора

Попробуйте это: http://www.coolphptools.com/color_extract .

PHP-класс Image Color Extract извлекает наиболее распространенные цвета (в процентах) из файла изображения. Значения цвета в шестнадцатеричном формате.

Автор: user2091347 Размещён: 16.04.2013 10:33

2 плюса

337 Репутация автора

Что касается ответа 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>

Кроме того, стоит упомянуть, что это просто самый «повторяющийся» цвет на изображении, который не может абсолютно считаться «доминирующим» цветом.

Автор: Shahroq Размещён: 20.11.2015 03:50

-3 плюса

2432 Репутация автора

Хотя это в javascript, но цветовой вор лучше всего подходит для получения доминирующего цвета в изображении.

https://github.com/lokesh/color-thief

Автор: Ajeet Lakhani Размещён: 29.12.2015 08:03

0 плюса

438 Репутация автора

PHP Простой цветной вор

🖼 Определить доминирующий цвет, используемый в изображении

Как это устроено

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/

Автор: adilbo Размещён: 12.06.2019 09:07
Вопросы из категории :
32x32