调色板API颜色提取不准确

时间:2016-02-27 08:14:49

标签: android palette

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

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

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

有什么方法可以做到吗?

1 个答案:

答案 0 :(得分:1)

Palette类不是为了从图像中准确提取像素颜色,而是为了给出和美学上令人愉悦的一组颜色,这些颜色只能用于UX目的。

你唯一能做的就是:

  1. 增加Palette算法使用的颜色数。
  2. 增加图像最大尺寸缩小到的尺寸。
  3. 您可以在生成调色板之前调整构建器设置:

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

    小心生成调色板非常昂贵! 您正在使用阻止调用线程的同步版本,确保您正在执行的操作,尤其是在您增加上述设置时。

    仅供参考,此处概述Palette的作用。

    我无法找到Palette类的最新来源,我认为原来Palette中的部分代码已经重构为Palette.Builder

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

    1. 缩小图像,使其最大尺寸适合100像素(默认情况下)
    2. 图像量化 1 ,因此颜色数为16(默认情况下)
    3. 量化器不返回图像,而是返回包含在名为Swatch的类中的剩余颜色列表(提供比简单int更多的语义)。

      之后构建调色板实例,并在量化器返回的样本中搜索配置文件样本(充满活力,充满活力的黑暗,充满活力的光,静音,暗静音,静音光)。

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

      由于多个样本可以匹配,因此计算加权函数 对于具有接近理想值并且代表更多像素的饱和度和亮度值的样本,此类函数给出更高的分数 饱和度匹配占亮度匹配的两倍,占人口数量的三倍。

      1 通过减少色彩空间(例如,从每像素24位到每像素4位)来量化不起作用,而是平均颜色(沿着最大尺寸),直到它们的数量低于或等于给定的阈值。
      ColorCutQuantizier source