Как извлечь цвета из изображения
Пипетка для фото, доминантные цвета, генерация палитры из картинки, инструменты для дизайнеров.
Нужен прямо сейчас? Инструмент для этой задачи:
Введение
Подобрать цвета для дизайна часто помогают сами изображения. Красивый закат, фото продукта, иллюстрация из Pinterest — всё это может стать источником вдохновения и готовой цветовой палитры. Но вручную «на глаз» определять доминирующие цвета неэффективно и неточно. Нужен инструмент, который проанализирует пиксели и выдаст палитру. В этой статье разберём, как работают такие инструменты, какие алгоритмы используются для выделения доминантных цветов, как применять извлечённую палитру в реальных проектах. Для практики используйте нашинструмент извлечения цветов из изображения.
Зачем извлекать цвета из изображений
У извлечения палитры из изображения есть несколько типичных сценариев:
- Согласованность с визуалом. Если на странице будет большая фотография, цвета интерфейса лучше подбирать из неё — так дизайн выглядит целостно.
- Реверс-инжиниринг палитры. Понравилась картинка с красивым сочетанием — извлекаем цвета и используем в своём проекте.
- Создание превью. Для генерации обложек видео и плейлистов берут доминантный цвет — он становится фоном.
- Генерация градиентов. Из двух доминантных цветов можно построить градиент, идеально подходящий к исходному фото. Подробнее — в статье проCSS-градиенты.
- Создание темы. На основе обоев рабочего стола или аватара генерируют цветовые темы интерфейса.
Как работает извлечение цветов
Изображение состоит из пикселей, у каждого из которых есть цвет. Несколько миллионов пикселей — это несколько миллионов цветов (с учётом антиалиасинга). Напрямую работать с таким объёмом неэффективно. Алгоритмы кластеризации группируют похожие цвета и выдают небольшой набор наиболее частых.
Основные этапы алгоритма:
- Загрузка изображения в Canvas через
drawImage. - Получение массива пикселей через
getImageData. - Уменьшение выборки — часто берут каждый 4-й или 10-й пиксель, чтобы ускорить обработку.
- Кластеризация — группировка похожих цветов.
- Сортировка кластеров по частоте и выбор топ-N.
Алгоритмы кластеризации
Для извлечения цветов используют несколько алгоритмов, у каждого свои плюсы и минусы.
K-means
Классический алгоритм кластеризации. Задаётся число кластеров K (5–6 для палитры), алгоритм итеративно распределяет пиксели по кластерам и пересчитывает центры. Хорошо работает, но медленный на больших изображениях.
Median Cut
Рекурсивно делит цветовое пространство пополам по каналу с наибольшим разбросом. Быстрее K-means, результат чуть менее точный, но для палитры из 5–8 цветов разница незаметна.
Octree
Строит восьмеричное дерево цветов. Очень быстрый, используется в большинстве онлайн-инструментов. Даёт стабильный результат для типичных задач.
Color quantization через гистограмму
Строит гистограмму по цветам (например, с шагом 16 значений на канал) и выбирает самые частые. Самый простой и быстрый метод, но менее точный — близкие цвета могут попасть в одну корзину.
Пример извлечения цветов на JavaScript
Покажем простую реализацию на Canvas. Этот код даёт грубое приближение, но демонстрирует принцип:
function extractColors(image, count = 6) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
// Уменьшаем для скорости
const size = 100;
canvas.width = size;
canvas.height = size;
ctx.drawImage(image, 0, 0, size, size);
const data = ctx.getImageData(0, 0, size, size).data;
const buckets = {};
for (let i = 0; i < data.length; i += 4) {
const r = data[i] & 0xf0;
const g = data[i + 1] & 0xf0;
const b = data[i + 2] & 0xf0;
const key = (r << 16) | (g << 8) | b;
buckets[key] = (buckets[key] || 0) + 1;
}
return Object.entries(buckets)
.sort((a, b) => b[1] - a[1])
.slice(0, count)
.map(([key, freq]) => {
const r = (key >> 16) & 0xff;
const g = (key >> 8) & 0xff;
const b = key & 0xff;
return { r, g, b, freq };
});
}Здесь используется гистограмма с шагом 16 (маска 0xf0) — это даёт 16³ = 4096 корзин, что достаточно для приличного результата. Для более точного извлечения используйте библиотеки вродеnode-vibrant илиcolor-thief.
Доминантный цвет и палитра
«Доминантный цвет» — самый частый цвет в изображении. Это не всегда тот, что вы ожидаете: на фото леса доминантным может оказаться не зелёный листьев, а серый неба, потому что небо занимает больше площади. Поэтому палитру обычно формируют из топ-N цветов, а не из одного.
Хороший алгоритм также фильтрует слишком близкие цвета: если в палитре два почти одинаковых оттенка синего, их объединяют. Дополнительно можно отсеивать слишком тёмные или слишком светлые цвета, чтобы палитра была «рабочей».
Vibrant и Muted палитры
Библиотека Vibrant (используется в Android и iOS) не просто извлекает частые цвета, а классифицирует их по тональности:
- Vibrant — насыщенный, среднего значения светлоты.
- Light Vibrant — насыщенный и светлый.
- Dark Vibrant — насыщенный и тёмный.
- Muted — приглушённый, средний.
- Light Muted — светлый и приглушённый.
- Dark Muted — тёмный и приглушённый.
Такая классификация удобна для UI: Vibrant используют для акцентов, Muted — для фонов и текста. Это даёт палитру, готовую к применению в интерфейсе, а не просто набор цветов.
Применение извлечённой палитры
Подбор акцентного цвета
Из палитры выберите один-два цвета как акцентные. Проверьте их на контраст с фоном черезинструмент проверки контраста — это обязательно для доступности.
Создание градиента
Возьмите два самых насыщенных цвета из палитры и используйте их вlinear-gradient. Это даёт градиент, идеально сочетающийся с фото на странице.
/* Извлечённая палитра: #2C5F8D, #4A90C2, #B8D4E8, #F4E4C1 */
.hero {
background: linear-gradient(135deg, #2C5F8D, #4A90C2);
color: #ffffff;
}Генерация темы
Цвета из изображения можно превратить в полный набор CSS-переменных для светлой и тёмной темы. Подробнее про построение шкал — в статье про генерацию палитр.
Превью для медиа
Доминантный цвет используют как фон для обложек видео и плейлистов — пока загружается само изображение, пользователь видит «родственный» фон, и переход выглядит плавным.
Сложные случаи
Изображения с градиентом
На фотографии с плавным градиентом «доминантных» цветов нет — каждый пиксель чуть отличается. Алгоритмы кластеризации всё равно найдут центры, но палитра будет выглядеть как набор промежуточных оттенков. В таких случаях полезно увеличить число кластеров или применять фильтр по насыщенности.
Чёрно-белые изображения
В чёрно-белом фото палитра состоит из оттенков серого. Если для дизайна нужны цветные акценты — извлекать цвета нет смысла, лучше использовать чёрно-белую шкалу как нейтральную основу.
Перенасыщенные фото
HDR-фото с перенасыщенными цветами даст палитру слишком ярких «кричащих» оттенков. Снизьте насыщенность в CSS через HSL преобразование: тот же Hue, S уменьшить на 20–30%, L — средний. Подробнее — в статье проHSL модель.
Логотипы и иконки
Логотипы часто содержат 1–3 цвета — извлечение палитры тут тривиально. Но алгоритм может «найти» антиалиасинг-переходы на границах. Решение: используйте маску прозрачности или фильтруйте пиксели по альфа-каналу.
Производительность и браузер
Обработка больших изображений в браузере занимает время. Чтобы избежать подвисаний интерфейса:
- Уменьшайте изображение до 100–200 пикселей по большей стороне перед анализом — этого достаточно для палитры.
- Используйте
requestIdleCallbackили Web Worker для тяжёлых вычислений. - Кэшируйте результат — повторно извлекать палитру из того же файла не нужно.
- Не вызывайте извлечение на каждом событии
onmousemove— только при загрузке изображения.
Пипетка цвета: точечный выбор
Иногда нужна не вся палитра, а цвет конкретного пикселя. Для этого используется «пипетка» — инструмент, который по клику на изображении выдаёт цвет пикселя. Реализация проста:
canvas.addEventListener('click', (e) => {
const rect = canvas.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
const pixel = ctx.getImageData(x, y, 1, 1).data;
const hex = '#' + [pixel[0], pixel[1], pixel[2]]
.map(v => v.toString(16).padStart(2, '0'))
.join('').toUpperCase();
console.log(hex);
});Этот приём используют в нашеминструменте извлечения цветов из изображения и впипетке цвета.
Инструменты ConvertHub для работы с цветом
- Извлечение цветов из изображения — главная утилита статьи.
- Пипетка цвета — выбор цвета в визуальном интерфейсе.
- Генератор палитры — построение цветовых схем на основе одного цвета.
- Конвертер HEX в RGB — перевод извлечённого цвета в разные форматы.
- Проверка контраста — убедитесь, что извлечённые цвета можно использовать для текста.
Все инструменты работают в браузере — изображения не загружаются на сервер, что важно для приватности и скорости.
Заключение
Извлечение цветов из изображения — мощный приём, который связывает визуал страницы с её интерфейсом. Алгоритмы кластеризации (K-means, Median Cut, Octree) выделяют доминантные цвета, а классификация по насыщенности и светлоте превращает их в готовую палитру. Используйте наш инструмент извлечения цветов для практики, а затем встраивайте полученные цвета в свой проект: через градиенты, темы, акцентные элементы. Не забывайте проверять контраст черезинструмент проверки контраста и читать статьи прогенерацию палитр итеорию цвета.
Попробуйте эти инструменты
Похожие статьи
HEX в RGB: конвертация цветовых форматов
Цветовые модели HEX и RGB, как конвертировать, использование в CSS, прозрачность (alpha).
HSL цветовая модель: понятнее чем RGB
HSL (Hue, Saturation, Lightness), преимущество над RGB, использование в CSS, конвертация.
Генерация цветовых палитр для дизайна
Создание цветовых схем, дополнительные цвета, аналоговые, триадные, инструменты для дизайнеров.
CSS градиенты: linear, radial, conic
Создание CSS градиентов, linear-gradient, radial-gradient, conic-gradient, примеры и генерация.