Как стать автором
Обновить

Игра в маляра, или Content-based color scheme: как цветовая схема приложения может меняться в зависимости от контента

Время на прочтение8 мин
Количество просмотров3.5K
Всего голосов 8: ↑8 и ↓0+8
Комментарии1

Комментарии 1

Для извлечения цветов из изображения у material color utilities есть собственное api:

val bitmap = ...
val buffer = IntArray(bitmap.width * bitmap.height + 1)
bitmap.getPixels(buffer, 0, bitmap.width, 0, 0, bitmap.width - 1, bitmap.height - 1)
val colors = QuantizerCelebi.quantize(buffer, /*maxColors=*/ 1)

Оно возвращает мапу цветов, где ключ - цвет, а значение - сколько он раз встречается, maxColors - сколько цветов будет нагенерировано, обычно нужен только 1 цвет.

Примечательно, но Palette и Quantizer порой извлекают не самые контрастные цвета, поэтому из нужно корректировать в системе Hct(тоже есть в библиотеке):

val chroma = 30.0
val dominant = colors.toList()[0].first.let { color ->
  Hct
    .fromInt(color)
    .apply { setChroma(chroma) }
    .toInt()
}

Сравнение цветов есть на примере ниже:

  • Palette - то, что сгенерировала библиотека Palette

  • Chroma Light/Dark Primary - зависимость primary цвета от темы(светлая/темная) и от самой chroma в системе hct

Зарегистрируйтесь на Хабре, чтобы оставить комментарий