Различия между цветами палитры Android

Edit

Чтобы лучше понять класс Android Palette, я решил сделать простое приложение для тестирования некоторых его функций - если вам интересно, вы можете найти приложение в Play Store: https://play.google.com/store/apps/details?id=com.tonyw.sampleapps.palettecolorextraction. В основном у него есть только изображения и цвета, которые извлекаются в классе палитры (см. Ниже), и вы можете добавить свои собственные изображения для тестирования. Вы можете найти мой исходный код в Github: https://github.com/tony-w/PaletteColorExtraction

Скриншоты Some pictures with corresponding extracted colorsAnother picture with extracted colorsTitle and body text color extracted based on background color

Оригинальное сообщение

Может кто-нибудь описать различия между цветами, которые можно извлечь из растрового изображения, используя класс Android Palette?

  • Яркий
  • Яркий темный
  • Яркий свет
  • Отключено
  • Приглушенная тьма
  • Приглушенный свет

Это просто, что приглушенные цвета более тусклые, чем яркие цвета? Являются ли темные и светлые, чтобы лучше соответствовать темным и светлым темам дизайна Lollipop, соответственно?

Ответы

Ответ 1

Это действительно хороший вопрос. Если вы посмотрите на исходный код, вы увидите, что различные образцы выбираются из анализа цветового профиля HSL пикселей на изображении, основанного на целевые диапазоны для яркости, насыщенности и совокупности (количество пикселей на изображении представлено образцом). Он использует средневзвешенный расчет с предпочтением яркости, затем насыщенность, затем население.

Вообще говоря, яркие цвета более насыщены, чем приглушенные цвета, темные цвета темнее, а светлые образцы легче. Какой из них вы используете, зависит от общего эффекта, который вы хотите.

Chris Banes написал в своем блоге "Яркие и темные Vibrant - это те, которые разработчики будут использовать в основном", но на практике это не совсем так же просто.

Один из примеров, который я нашел, - это метод applyPalette в пример приложения Romain Guy от Google IO 2014, хотя код предполагает различные (возможно, потому, что он работает с известными изображениями).

В зависимости от изображения возможно, что некоторые типы образцов не будут найдены, поэтому обязательно учтите эту возможность в вашем коде.

Например, вы можете попробовать получить образцы из палитры в определенном порядке, например. для темной темы вы можете попробовать получить Vibrant Dark, затем Muted Dark, а затем вернуться к цвету по умолчанию.

Если вам нужно что-то более предсказуемое, также можно захватить наиболее представленный цвет, например:

public static Palette.Swatch getDominantSwatch(Palette palette) {
    // find most-represented swatch based on population
    return Collections.max(palette.getSwatches(), new Comparator<Palette.Swatch>() {
        @Override
        public int compare(Palette.Swatch sw1, Palette.Swatch sw2) {
            return Integer.compare(sw1.getPopulation(), sw2.getPopulation());
        }
    });
}

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


Использование пользовательских целей

Еще одна полезная вещь - определить некоторые пользовательские цели в дополнение к 6 целям, определенным в Palette.Target, с различными значениями веса и целевого значения веса и цели, чтобы увеличить вероятность поиска полезного цвета.

Например, вы можете попросить квантователь Palette включить образец для наиболее доминирующего цвета, который соответствует текущим критериям фильтра с таким типом:

public static final Target DOMINANT;

static {
    DOMINANT = new Target.Builder().setPopulationWeight(1f)
                                   .setSaturationWeight(0f)
                                   .setLightnessWeight(0f)
                                   .setExclusive(false)
                                   .build();
}

И вы можете получить некоторые полезные образцы, которые ставят более высокий приоритет на легкость, чем целевые фонды, такие как:

public static final Target DARK;
public static final Target LIGHT;
public static final Target NEUTRAL;

static {
    DARK = new Target.Builder().setMinimumLightness(0f)
                               .setTargetLightness(0.26f)
                               .setMaximumLightness(0.5f)
                               .setMinimumSaturation(0.1f)
                               .setTargetSaturation(0.6f)
                               .setMaximumSaturation(1f)
                               .setPopulationWeight(0.18f)
                               .setSaturationWeight(0.22f)
                               .setLightnessWeight(0.60f)
                               .setExclusive(false)
                               .build();

    LIGHT = new Target.Builder().setMinimumLightness(0.50f)
                                .setTargetLightness(0.74f)
                                .setMaximumLightness(1.0f)
                                .setMinimumSaturation(0.1f)
                                .setTargetSaturation(0.7f)
                                .setMaximumSaturation(1f)
                                .setPopulationWeight(0.18f)
                                .setSaturationWeight(0.22f)
                                .setLightnessWeight(0.60f)
                                .setExclusive(false)
                                .build();

    NEUTRAL = new Target.Builder().setMinimumLightness(0.20f)
                                  .setTargetLightness(0.5f)
                                  .setMaximumLightness(0.8f)
                                  .setMinimumSaturation(0.1f)
                                  .setTargetSaturation(0.6f)
                                  .setMaximumSaturation(1f)
                                  .setPopulationWeight(0.18f)
                                  .setSaturationWeight(0.22f)
                                  .setLightnessWeight(0.60f)
                                  .setExclusive(false)
                                  .build();
}

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

Palette.Swatch neutral = Palette.getSwatchForTarget(NEUTRAL);

Обратите внимание на фильтр по умолчанию

По умолчанию Palette имеет Palette.Filter, который отклоняет цвета, очень близкие к черному или белым, а также цвета "очень близко к красной строке I", которые, как я полагаю, относятся к изохронным цветам, которые трудны для людей с красно-слепой цветной слепоты.

Моя теория заключается в том, что она отвергает почти белые и почти черные цвета, чтобы помочь предотвратить их выбор в качестве "насыщенных" цветов, когда насыщенность высоко взвешена.

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

Однако этот фильтр можно удалить с помощью Palette.Builder.clearFilters() и добавить свой собственный фильтр с помощью Palette.Builder.addFilter().

В моем коде я решил сделать вторую попытку создания палитры, если первая попытка не возвращает образцы:

Palette palette = new Palette.Builder(bitmap).addTarget(DOMINANT)
                                             .addTarget(DARK)
                                             .addTarget(LIGHT)
                                             .addTarget(NEUTRAL)
                                             .generate();
if(palette.getSwatches().isEmpty()) {
    Log.v(TAG, "Getting alternate (UNFILTERED) palette.");
    palette = new Palette.Builder(bitmap).addTarget(DOMINANT)
                                         .addTarget(DARK)
                                         .addTarget(LIGHT)
                                         .addTarget(NEUTRAL)
                                         .clearFilters() /// allow isBlack(), isWhite(), isNearRedILine()
                                         .generate();
}

Цепь попыток в большинстве случаев сохраняет полезность фильтра по умолчанию, но все же позволяет вам находить образцы для изображений, которые по умолчанию будут полностью отклоняться.