顏色表示和位操做

 

顏色表示和位操做

 

  今天在看一個Android開源代碼的時候看到中間有這麼一句:html

mTextView.setBackgroundColor(alpha << 24 | (0xbbffbb)); mTextView.setTextColor(alpha << 24 | (0x000000));

  其中mTextView是TextView類的對象,而alpha是一個0到255之間的int值。shell

  雖然知道是設置顏色,可是這種寫法仍是引發了個人好奇心。ui

  怎麼又是位移操做又是與運算的。spa

  搜索一下,找到一份資料:http://m.oschina.net/blog/104123.net

  整理轉述得此文。插件

 

首先科普一下顏色的表示:

  首先,顏色各個份量通常是以每8位爲一個單位。code

  8位,8bit,即一個字節,10進制數的取值範圍是0~255,通常用16進製表示,0x開頭,取值範圍是0x000xFF(不區分大小寫)。htm

 

  顏色通常有24位32位兩種表示方法。對象

  24位顏色:每8位表示RGB中的一個份量。RGB顏色份量的值越大的時候最終顏色越偏向於這個顏色。blog

  32位顏色:除了每8位表示RGB中的一個份量,還有一個8位用於表示透明度,表示爲ARGB形式。

  A即alpha值,alpha值爲0時顏色爲透明,alpha值爲最大值時顏色爲徹底不透明,便可徹底覆蓋處於它下面的其餘顏色,無其餘顏色能夠透過它而顯示出來。

 

 

那麼位移操做是怎麼回事呢?

  如圖:

  表示顏色份量的數要想轉化成一個整個的顏色,就必須和其餘的份量組合,每一個份量放在本身應當處於的位置,就應該進行位移操做。

 

  固然我開始的時候還小迷惑了一下這個資料中給出的例子:http://m.oschina.net/blog/104123

  若是顏色值都是34,23,88等兩位十進制數,而它所說的轉換竟然也就是把數字直接放過去了,那0到255的數字,255咋辦?三位數呢?

  後來想了一下,做者的圖是對的,可是文字配的有點問題。

  圖中的顏色值34,23和88都是十六進制表示的,因此移位操做的時候能夠直接移動位置表示。

  移位後就是總體移動相應的位數,一個字母表明四位。

  R移動16位,G移動8位,B不須要移動。

  若是有A值,則A須要向左移動24位。

 

  須要注意的是,無論是用什麼進製表示,十進制仍是十六進制仍是二進制,位移操做都是二進制範疇的。

 

  爲何說原做者有點小錯誤呢?

  十進制的34,用十六進制表示是0x22。

  若是是十進制R34,G23,B88。移位操做後,獲得的顏色數值應該是0x221758。

 

反向的轉換:從顏色中提取份量

  反向的轉換則是右移。

  知道一個顏色總體值,想提取某一個顏色份量,方法就是向右移動相應的位數,而後作一個與運算,與0xFF作與運算能夠提取最低的兩位。

  這一步參考資料說得很明白:

  直接把例子搬過來:

 

  如今咱們知道了rgb的16進制值,那反過來呢?若是咱們知道了一個顏色值,如何反向求解rgb值呢?

  var color:uint = 0x342388;

  var r:uint = color >> 16;//右移16位,把2388移出,取0x34

  var g:uint = color >> 8 & 0xff;//右移8位,把88移出,得0x3423,與0xff按位與操做,得0x23

  var b:uint = color & 0xff;//獲得0x88

 

  咱們再來看看32位的:

  var color:uint = 0xff342388;

  var a:uint = color >>> 24 //注意這裏是>>>,無符號右移位操做,右移24位,把342388移出,獲得0xff

  var r:uint = color >> 16 & 0xff;//右移16位,把2388移出,取0x34

  var g:uint = color >> 8 & 0xff;//右移8位,把88移出,得0x3423,與0xff按位與操做,得0x23

  var b:uint = color & 0xff;//獲得0x88

 

 

參考資料:

  位操做也瘋狂:http://m.oschina.net/blog/104123

 

  PS,推薦在線顏色選擇器:http://coolshell.cn/articles/3314.html

  PPS:FireFox上也有插件(ColorZilla),能夠直接從網頁上提取顏色,獲取其顏色值。

相關文章
相關標籤/搜索