最近在做Android项目中有这样一个需求:在首页的每个Feed有一张图片,图片上有文字等其它属性,上面的属性随着图片颜色的不同做出相应的变化,保证属性都能够看得清。
解决方案:利用Android的Palette解析,官方文档这样介绍Palette
需要知道的是上面涉及到的Vibrant、Muted、Muted Light等都有可能会提取不到,所以我们必须保证拿到一个值作为标准,这时我们很有必要知道Palette(调色板)的原理。
调色板的简单原理:
PC机上 显示的图象是由一个个像素组成的,每个像素都有自己的颜色属性。在PC的显示系统中,像素的颜色是基于RGB模型的,每一个像素的颜色由红(B)、绿 (G)、蓝(B)三原色组合而成。每种原色用8位表示,这样一个的颜色就是24位的。以此推算,PC的SVGA适配器可以同时显示224约一千六百多万种颜色。24位的颜色通常被称作真彩色,用真彩色显示的图象可达到十分逼真的效果。但是,真彩色的显示需要大量的视频内存,一幅640×480的真彩色图象需要约1MB的视频内存。由于数据量大增,显示真彩色会使系统的整体性能迅速下降。原理图:
为了解决这个问题,计算机使用调色板来限制颜色的数目。调色板实际上是一个有256个表项的RGB颜色表,颜色表的每项是一个24位的RGB颜色值。使用调色板时,在视频内存中存储的不是的24位颜色值,而是调色板的4位或8位的索引。这样一来,显示器可同时显示的颜色被限制在256色以内,对系统资源的耗费大大降低了(不同时刻可以采用不同的调色板,因此可以扩展总共可以显示的颜色)。
显示器可以被设置成16、256、64K、真彩色等显示模式,前两种模式需要调色板。在16或256色模式下,程序必须将想要显示的颜色正确地设置到调色板中,这样才能显示出预期的颜色。图11.1显示了调色板的工作原理。使用调色板的一个好处是不必改变视频内存中的值,只需改变调色板的颜色项就可快速地改变一幅图象的颜色或灰度。
除此之外还要知道的一个知识点是HSL值( H: Hue 色相 S:Saturation 饱和度 L Lightness 明度)其中L是其中L是从黑(0)到白(255)渐变。最后结合上面的知识点解决问题的思路也就有了:
第一步:得到所要解析图片的BItmap
第二步:缩小Bitmap(提升性能)
第三步:异步方式提取Bitmap样本(Swatch)让样本的Color值尽量少,原因是我们主要想拿到HSL值中的Lightness明度值。
第四步:获取明度值Lightness,一般大于75%文字偏向与黑色,否则白色。
各位还请切磋赐教
2015/ 7/10 于北京 白袍君