我使用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%。
有什么方法可以做到吗?
答案 0 :(得分:1)
Palette
类不是为了从图像中准确提取像素颜色,而是为了给出和美学上令人愉悦的一组颜色,这些颜色只能用于UX目的。
你唯一能做的就是:
Palette
算法使用的颜色数。您可以在生成调色板之前调整构建器设置:
final Palette palette
= Palette
.from(source)
.maximumColorCount(numerOfColors)
.resizeBitmapSize(bitmapLargestDimension)
.generate();
小心生成调色板非常昂贵! 您正在使用阻止调用线程的同步版本,确保您正在执行的操作,尤其是在您增加上述设置时。
仅供参考,此处概述Palette
的作用。
我无法找到Palette
类的最新来源,我认为原来Palette
中的部分代码已经重构为Palette.Builder
。
如果您查看generate
方法的source code,您会看到
量化器不返回图像,而是返回包含在名为Swatch
的类中的剩余颜色列表(提供比简单int
更多的语义)。
之后构建调色板实例,并在量化器返回的样本中搜索配置文件样本(充满活力,充满活力的黑暗,充满活力的光,静音,暗静音,静音光)。
配置文件定义saturation and luma的可接受值范围以及理想饱和度和亮度值 通过查找属于配置文件范围内的样本来执行搜索。
由于多个样本可以匹配,因此计算加权函数 对于具有接近理想值并且代表更多像素的饱和度和亮度值的样本,此类函数给出更高的分数 饱和度匹配占亮度匹配的两倍,占人口数量的三倍。
1
通过减少色彩空间(例如,从每像素24位到每像素4位)来量化不起作用,而是平均颜色(沿着最大尺寸),直到它们的数量低于或等于给定的阈值。
见ColorCutQuantizier source