У меня есть jpg-изображение.
Мне нужно знать «общий средний» цвет изображения. На первый взгляд можно использовать гистограмму изображения (канал RGB).
На работе я использую в основном JavaScript и PHP (немного Python), поэтому приветствовал решение на этих языках. Возможно, это библиотека для работы с изображениями, которые затрагивают аналогичные проблемы.
Мне не нужно динамически определять цвет изображения. Мне нужно только один раз пройти весь массив изображений и определить цвет каждого отдельно (эту информацию я буду помнить для будущего использования).
Вы можете использовать PHP для получения массива цветовой палитры:
<?php function colorPalette($imageFile, $numColors, $granularity = 5) { $granularity = max(1, abs((int)$granularity)); $colors = array(); $size = @getimagesize($imageFile); if($size === false) { user_error("Unable to get image size data"); return false; } $img = @imagecreatefromjpeg($imageFile); // Andres mentioned in the comments the above line only loads jpegs, // and suggests that to load any file type you can use this: // $img = @imagecreatefromstring(file_get_contents($imageFile)); if(!$img) { user_error("Unable to open image file"); return false; } for($x = 0; $x < $size[0]; $x += $granularity) { for($y = 0; $y < $size[1]; $y += $granularity) { $thisColor = imagecolorat($img, $x, $y); $rgb = imagecolorsforindex($img, $thisColor); $red = round(round(($rgb['red'] / 0x33)) * 0x33); $green = round(round(($rgb['green'] / 0x33)) * 0x33); $blue = round(round(($rgb['blue'] / 0x33)) * 0x33); $thisRGB = sprintf('%02X%02X%02X', $red, $green, $blue); if(array_key_exists($thisRGB, $colors)) { $colors[$thisRGB]++; } else { $colors[$thisRGB] = 1; } } } arsort($colors); return array_slice(array_keys($colors), 0, $numColors); } // sample usage: $palette = colorPalette('rmnp8.jpg', 10, 4); echo "<table>\n"; foreach($palette as $color) { echo "<tr><td style='background-color:#$color;width:2em;'> </td><td>#$color</td></tr>\n"; } echo "</table>\n";
Что дает вам массив, значения которого выше для того, как часто этот цвет использовался.
EDIT . Комментируя вопрос, как использовать это для всех файлов в каталоге, вот он:
if ($handle = opendir('./path/to/images')) { while (false !== ($file = readdir($handle))) { $palette = colorPalette($file, 10, 4); echo "<table>\n"; foreach($palette as $color) { echo "<tr><td style='background-color:#$color;width:2em;'> </td><td>#$color</td></tr>\n"; } echo "</table>\n"; } closedir($handle); }
возможно, не захочет делать это на слишком большом количестве файлов, но это ваш сервер.
Альтернативно, если вы предпочитаете использовать библиотеку Color-Theif Javascript Lokesh, то именно то, что вы ищете.
Объединяя Дж. Кирчарца и Александра Хьюгестранда, ответьте:
function getAverage($sourceURL){ $image = imagecreatefromjpeg($sourceURL); $scaled = imagescale($image, 1, 1, IMG_BICUBIC); $index = imagecolorat($scaled, 0, 0); $rgb = imagecolorsforindex($scaled, $index); $red = round(round(($rgb['red'] / 0x33)) * 0x33); $green = round(round(($rgb['green'] / 0x33)) * 0x33); $blue = round(round(($rgb['blue'] / 0x33)) * 0x33); return sprintf('#%02X%02X%02X', $red, $green, $blue); }
Пробовал и тестировал, возвращает шестую строку.
Начните с PIL. http://www.pythonware.com/products/pil/
Откройте объект Image. Используйте метод getdata
для получения всех пикселей. Средние значения, которые вы возвращаете.
Что-то вроде этого.
Определение цвета изображения с использованием python
Более коротким решением для истинного цветного изображения было бы масштабирование до размера 1×1 пикселя и выборка цвета в этом пикселе:
$ scaled = imagescale ($ img, 1, 1, IMG_BICUBIC); $ meanColor = imagecolorat ($ img, 0, 0);
… но я не проверял это сам.
Я создал пакет композитора, который предоставляет библиотеку для выбора среднего цвета из данного изображения по его пути.
Вы можете установить его, выполнив следующую команду в каталоге проекта:
composer require tooleks/php-avg-color-picker
Пример использования:
<?php use Tooleks\Php\AvgColorPicker\Gd\AvgColorPicker; $imageAvgHexColor = (new AvgColorPicker)->getImageAvgHexByPath('/absolute/path/to/the/image.(jpg|jpeg|png|gif)'); // The `$imageAvgHexColor` variable contains the average color of the given image in HEX format (#fffff).
См. Документацию .