Android调色板颜色之间的差异

编辑

为了更好地体验Android Palette类,我决定制作一个简单的应用程序来testing它的一些function – 如果您有兴趣,可以在Play Store上find该应用程序: https : //play.google.com/ store / apps / details?id = com.tonyw.sampleapps.palettecolorextraction 。 基本上它只是有调色板类提取的图像和颜色(下面提到),并且您可以添加自己的图像来testing。 你可以在Github上find我的源代码: https : //github.com/tony-w/PaletteColorExtraction

截图 一些图片与相应的提取颜色提取颜色的另一张图片根据背景颜色提取标题和正文文本颜色

原帖

有人可以描述使用Android的Palette类可以从位图中提取的颜色之间的区别吗?

  • 充满活力
  • 充满活力的黑暗
  • 充满活力的光
  • 静音
  • 昏昏沉沉
  • 静音的光

那只是柔和的颜色比鲜艳的颜色更沉闷? 黑暗与光明是否应该更好地匹配棒棒糖的黑暗与光明的材料devise主题?

Solutions Collecting From Web of "Android调色板颜色之间的差异"

这是一个非常好的问题。 如果您查看源代码,您可以看到根据亮度,饱和度和总体的目标范围(图像中的多less个像素)分析图像上的像素的HSL颜色configuration文件来select不同的色板色板)。 它使用加权平均计算,优先考虑亮度 ,然后是饱和度 ,然后是总体

一般来说,鲜艳的色彩比柔和的色彩更饱和,深色更暗,浅色更浅。 你使用哪一个取决于你想要的整体效果。

克里斯·巴恩斯( Chris Banes )在他的博客中写道: “开发者主要使用的是充满活力和黑暗的活力”,但实际上并不那么简单。

我发现的一个例子是来自Google IO 2014的Romain Guy示例应用程序中的applyPalette方法,尽pipe代码假设会find各种色板(可能是因为他正在处理已知的图像)。

根据图像的不同,可能会找不到一些色板types,所以请务必在代码中说明这种可能性。

例如,你可以尝试按照特定的顺序从调色板中获取色板,例如,对于黑暗主题,你可能会尝试获取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值也是可以访问的,所以你可以写一个类似的程序来select,例如,最不饱和的颜色不是主色。


使用自定义目标

我发现另一个有用的东西是除了在Palette.Target定义的6个目标以外,还定义了一些自定义目标,具有不同的权重和目标明度和饱和度值,以增加find有用颜色的机会。

例如,您可以要求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); 

请注意默认的filter

默认情况下, Palette有一个Palette.Filter ,它可以Palette.Filter地拒绝接近黑色或白色的颜色,以及“非常接近红色I线”的颜色 ,我相信这是指同步颜色 ,对于红盲色盲者。

我的理论是,它拒绝接近白色和接近黑色的颜色,以防止在饱和度高的情况下被选为“饱和”颜色。

然而,这个filter的结果是,对于完全由几乎白色和/或几乎黑色的像素组成的图像,将不会find样本,并且倾向于避免select具有粉红色调的颜色。

但是,可以使用Palette.Builder.clearFilters()删除此filter,并使用Palette.Builder.clearFilters()添加您自己的filter。

在我的代码中,如果第一次尝试不返回任何色板,我已经select再次尝试生成调色板:

 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(); } 

在大多数情况下,链接这些尝试保留了默认filter的用处,但仍然允许您为默认会完全拒绝的图像查找色板。