调色板 API 提取的颜色不准确

Palette API color extracted not accurate

我正在使用 v7.Palette Api 提取图像颜色,但提取的颜色几乎有 50% 不准确,我想从 image.The 代码中提取最突出的颜色我正在使用

  final Palette palette = Palette.from(source).generate();
               if (palette != null) {
                   Palette.Swatch vibrant;
                              palette.getDarkMutedSwatch() :
                              palette.getLightMutedSwatch();
                              palette.getMutedSwatch();                                                            palette.getDarkVibrantSwatch() :
                              palette.getLightVibrantSwatch();
                              palette.getVibrantSwatch();
}

我尝试了所有方法,但 none 准确提取颜色超过 50%。

有什么方法可以做到吗?

Palette class 并非用于从图像中准确提取像素颜色,而是其目的是提供一组美观且令人愉悦的颜色,仅可用于 UX 目的。

您唯一能做的是:

  1. 增加 Palette 算法使用的颜色数量。
  2. 增加图像最大尺寸缩小到的尺寸。

您可以在生成调色板之前调整构建器设置:

final Palette palette       
    = Palette
        .from(source)
        .maximumColorCount(numerOfColors)
        .resizeBitmapSize(bitmapLargestDimension)
        .generate();

注意生成调色板非常昂贵!
您使用的是同步版本,它会阻塞调用线程,请确保您在做什么,尤其是当您增加上述设置时。


仅供参考,这里总结了Palette的作用。

我找不到Paletteclass的最新源码,我假设Palette中的一些代码已经被重构到Palette.Builder

如果您查看 generate 方法的 source code,您会看到

  1. 图像按比例缩小,使其最大尺寸适合 100 像素(默认)
  2. 图像被量化1使得颜色数为16(默认)

量化器不是 return 图像,而是包含在称为 Swatch 的 class 中的剩余颜色列表(它比简单的 [=19= 提供更多语义) ]).

之后构建调色板实例并在样本中搜索配置文件样本(Vibrant、Vibrant Dark、Vibrant Light、Muted、Muted Dark、Muted Light)return由量化器编辑。

配置文件定义了 saturation and luma 的可接受值范围以及理想的饱和度和亮度值。
搜索是通过查找落在配置文件范围内的样本来执行的。

由于可以匹配多个样本,因此计算了一个加权函数。
这样的函数对饱和度和亮度值更接近理想值并代表更多像素的样本给予更高的分数。
饱和度匹配是亮度匹配的两倍,是人口计数的三倍。


1 量化不是通过减少颜色 space(例如从每像素 24 位到每像素 4 位)来实现的,而是通过平均颜色(沿着最大维度)直到它们的数量低于或等于给定的阈值.
参见 ColorCutQuantizier source