5.0学习计划--Palette详解

来源:互联网 发布:淘宝网买药提交需求 编辑:程序博客网 时间:2024/06/03 20:44

Palette是一个类似调色板的工具类,根据传入的bitmap,提取出主体颜色,使得图片和颜色更加搭配,界面更协调。

它是一个建造者模式的实例化模式,用法很简单,总的说来分三步:

1、通过builder添加参数:

Palette p = Palette.from(BitMap)//将图片传入调色板中                                    .addFilter(Filter)//添加一个过滤器,根据HSL过滤(可以不设置,有默认值)                                    .maximumColorCount(20)//设置一个颜色种数的临界值,有效的颜色块数量小于这个值,直接用这些颜色作为最终统计到的样本。有效的颜色块后面解释(可以不设置,有默认值)                                    .resizeBitmapSize(480)//bitmap放入调色板时,会先压缩,提高计算速率,这里就是设置压缩后的尺寸。(可以不设置,有默认值)                                    .clearFilters()//清除颜色过滤器(可以不调用)                                    .generate();//第二步,创建Palette实例。
2、构建Palette实例。产生实例的方法generate有无参和有参数的两个重载方法。

无参的直接返回Palette,是同步方法。

有参的返回的是一个异步任务,通过传入的参数回调。因为统计图片颜色是比较耗时的,颜色种类越多,耗时越长。

 Palette.from(((GlideBitmapDrawable)resource).getBitmap()).generate(new Palette.PaletteAsyncListener() {                                public void onGenerated(Palette p) {                                    //通过异步获取调色盘,然后给需要的控件上色。                                   List<Palette.Swatch> swatches=p.getSwatches();                                    for(Palette.Swatch swatch:swatches){                                        if(swatch!=null){                                            tvTitle.setTextColor(swatch.getRgb());                                            return;                                        }                                    }                                }                            });
3、通过Palette获取颜色。Palette取得的颜色并不是一种,有可能有多个样本。它提供了6种风格的颜色:

p.getDarkMutedColor(defaultColor);p.getDarkVibrantColor(defaultColor);p.getLightMutedColor(defaultColor);p.getLightVibrantColor(defaultColor);p.getMutedColor(defaultColor);p.getVibrantColor(defaultColor);

柔和三种,生动三种。但并不一定每种都采集到了合适的颜色。

好了,使用方法讲完, 接下来是分析源码。首先,我们需要了解几个概念。

RGB彩色空间:把颜色抽象到空间模型中,“Color Space”,彩色空间,又称作色域。RGB彩色空间是Color Space的一种,将R、G、B三色作为xyz轴,其颜色模型如下图。在这个彩色空间里可以表示所有RGB的颜色(256*256*256种),当然,这并不代表自然界的所有颜色。

HSL:工业界的一种颜色标准,是通过对色相(H)、饱和度(S)、明度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,它和RGB是可以互相转换的。这里就不提供转化算法了。

VBox:java对象,代表一个RGB彩色空间,或者说是子彩色空间,下图中的每个方块都可以是一个Vbox。




Palette的取色原理:通过builder构建palette的过程就是量化统计颜色的过程,这个过程是发生在builder的generate()方法里,首先压缩图片至指定(resizeBitmapSize(int size))或者默认大小,从而减少计算量,然后构建一个ColorCutQuantizer用于颜色采集,采集满足要求颜色的逻辑就是它来实现的。接下来把采集到的样本交给Palette里的Generator,通过Generator筛选出Muted、vibrant等6种风格颜色。

在这个过程中,最重要的当属ColorCutQuantizer的采集过程。这里用到了Median-cut(中位切分法算法)。

吃完饭再讲。。。。。

0 0
原创粉丝点击