?????? 最近在做Android項(xiàng)目中有這樣一個(gè)需求:在首頁的每個(gè)Feed有一張圖片,圖片上有文字等其它屬性,上面的屬性隨著圖片顏色的不同做出相應(yīng)的變化,保證屬性都能夠看得清。???????
?????? 解決方案:利用Android的Palette解析,官方文檔這樣介紹Palette

???? 需要知道的是上面涉及到的Vibrant、Muted、Muted Light等都有可能會(huì)提取不到,所以我們必須保證拿到一個(gè)值作為標(biāo)準(zhǔn),這時(shí)我們很有必要知道Palette(調(diào)色板)的原理。?????
???? 調(diào)色板的簡單原理:
????? PC機(jī)上 顯示的圖象是由一個(gè)個(gè)像素組成的,每個(gè)像素都有自己的顏色屬性。在PC的顯示系統(tǒng)中,像素的顏色是基于RGB模型的,每一個(gè)像素的顏色由紅(B)、綠 (G)、藍(lán)(B)三原色組合而成。每種原色用8位表示,這樣一個(gè)的顏色就是24位的。以此推算,PC的SVGA適配器可以同時(shí)顯示224約一千六百多萬種顏色。24位的顏色通常被稱作真彩色,用真彩色顯示的圖象可達(dá)到十分逼真的效果。但是,真彩色的顯示需要大量的視頻內(nèi)存,一幅640×480的真彩色圖象需要約1MB的視頻內(nèi)存。由于數(shù)據(jù)量大增,顯示真彩色會(huì)使系統(tǒng)的整體性能迅速下降。原理圖:
????? 為了解決這個(gè)問題,計(jì)算機(jī)使用調(diào)色板來限制顏色的數(shù)目。調(diào)色板實(shí)際上是一個(gè)有256個(gè)表項(xiàng)的RGB顏色表,顏色表的每項(xiàng)是一個(gè)24位的RGB顏色值。使用調(diào)色板時(shí),在視頻內(nèi)存中存儲(chǔ)的不是的24位顏色值,而是調(diào)色板的4位或8位的索引。這樣一來,顯示器可同時(shí)顯示的顏色被限制在256色以內(nèi),對(duì)系統(tǒng)資源的耗費(fèi)大大降低了(不同時(shí)刻可以采用不同的調(diào)色板,因此可以擴(kuò)展總共可以顯示的顏色)。
? ?? 顯示器可以被設(shè)置成16、256、64K、真彩色等顯示模式,前兩種模式需要調(diào)色板。在16或256色模式下,程序必須將想要顯示的顏色正確地設(shè)置到調(diào)色板中,這樣才能顯示出預(yù)期的顏色。圖11.1顯示了調(diào)色板的工作原理。使用調(diào)色板的一個(gè)好處是不必改變視頻內(nèi)存中的值,只需改變調(diào)色板的顏色項(xiàng)就可快速地改變一幅圖象的顏色或灰度。
??? 除此之外還要知道的一個(gè)知識(shí)點(diǎn)是HSL值( H: Hue 色相 S:Saturation 飽和度 L Lightness 明度)其中L是其中L是從黑(0)到白(255)漸變。最后結(jié)合上面的知識(shí)點(diǎn)解決問題的思路也就有了:
???????? 第一步:得到所要解析圖片的BItmap
? ? ? ? ?第二步:縮小Bitmap(提升性能)
? ? ? ? ?第三步:異步方式提取Bitmap樣本(Swatch)讓樣本的Color值盡量少,原因是我們主要想拿到HSL值中的Lightness明度值。
? ? ? ? ?第四步:獲取明度值Lightness,一般大于75%文字偏向與黑色,否則白色。

?????? 各位還請(qǐng)切磋賜教
?????? 2015/ 7/10 于北京 ? 白袍君