轉載顏色模式RGB888->RGB565

 
 
2011年03月04日 星期五 7:51

今天在REVIEW代碼的時候,發現了這樣一個宏定義:

#define COLOR_TO_MTK_COLOR_SIMUL(color) ((((color) >> 19) & 0x1f) << 11) \
                                            |((((color) >> 10) & 0x3f) << 5)  \
                                            |(((color) >> 3) & 0x1f) 

大家知道這個宏是用來幹什麼的嗎?

仔細分析後,原來就是實現了RGB888到RGB565的轉換,查閱相關資料後,發現網絡上有一篇牛人寫的東東,在此和大家分享。

講一下量化壓縮與量化補償吧

  在進行色彩格式轉換的時候,經常會遇到色彩量化位數的改變,比如說從 24bit RGB888 到 16bit RGB565 的色彩轉換。所謂量化壓縮與量化補償都是我個人所提出的概念,現說明如下。

  量化壓縮,舉例:

  24bit RGB888 -> 16bit RGB565 的轉換

  24ibt RGB888 R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2 B1 B0

  16bit RGB656 R7 R6 R5 R4 R3 G7 G6 G5 G4 G3 G2 B7 B6 B5 B4 B3

  量化位數從8bit到5bit或6bit,取原8bit的高位,量化上做了壓縮,卻損失了精度。

  量化補償,舉例:

  16bit RGB565 -> 24bit RGB888 的轉換

  16bit RGB656 R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0

  24ibt RGB888 R4 R3 R2 R1 R0 0 0 0 G5 G4 G3 G2 G1 G0 0 0 B4 B3 B2 B1 B0 0 0 0

  24ibt RGB888 R4 R3 R2 R1 R0 R2 R1 R0 G5 G4 G3 G2 G1 G0 G1 G0 B4 B3 B2 B1 B0 B2 B1 B0

  說明:第二行的 24bit RGB888 數據爲轉換後,未進行補償的數據,在精度上會有損失

  第三行的 24bit RGB888 數據爲經過量化補償的數據,對低位做了量化補償

  可以很容易的證明,這樣的補償方法是一種合理的線性補償。補償的原理很簡單,大家仔細想一下就明白了,因此不再詳細說明。

  總結一下:

  量化壓縮的方法:三個字取高位

  量化補償的方法:

  1. 將原數據填充至高位

  2. 對於低位,用原始數據的低位進行補償

  3. 如果仍然有未填充的位,繼續使用原始數據的低位進行循環補償

  解釋一下循環補償的概念:

  8bit RGB332 -> 24bit RGB888 的轉換

  8bit RGB332 R2 R1 R0 G2 G1 G0 B1 B0

  24bit RGB888 R2 R1 R0 0 0 0 0 0 G2 G1 G0 0 0 0 0 0 B1 B0 0 0 0 0 0 0

  24bit RGB888 R2 R1 R0 R2 R1 R0 0 0 G2 G1 G0 G2 G1 G0 0 0 B1 B0 B1 B0 0 0 0 0

  24bit RGB888 R2 R1 R0 R2 R1 R0 R2 R1 G2 G1 G0 G2 G1 G0 G2 G1 B1 B0 B1 B0 B1 B0 0 0

  24bit RGB888 R2 R1 R0 R2 R1 R0 R2 R1 G2 G1 G0 G2 G1 G0 G2 G1 B1 B0 B1 B0 B1 B0 B1 B0

  看了這個,應該明白則麼回事了吧,其中B分量,進行了四輪的補償,達到要求。

  量化補償的必要性,從直覺上講,我所提出的這種補償方法是正確的(因爲我並沒有嚴格的去證明),進行這樣的補償,在做色彩各式轉換的時候,能夠明顯的改善色彩效果,減少精度上的損失。

  對256色調色板模式的認識和應用,順便講一下這個,因爲量化壓縮和量化補償剛好可以應用到調色板模式下。大家都知道,很早以前就有人提過出256色的標準調色板的概念(有的人又稱之爲抖動調色板或者萬能調色板),其實這樣的調色板並不神祕。256色中,一個像素點用8bit表示,那麼如果採用 8bit RGB332 的格式,一切問題都可以想通,並且可以進行很好的處理了。對於每個 RGB332 的顏色,都可以使用量化補償的做法,將其轉換爲 24bit RGB888 的顏色格式,然後將其設置爲調色板即可。這樣,實質上是將256色調色板模式,轉換爲了 8bit RGB332 的像素格式。這樣的調色板方式,更加利於某些方面的處理,比如調色板匹配、Alpha混合等。由於採用了這樣的方法,一個像素點的顏色值,與其實際的RGB顏色值,可以很方便的通過量化補償的方法轉換出來,然後就可以對各個顏色分量進行計算,計算完畢,再使用量化壓縮的方法,就可以生成最終需要的顏色值。而所謂的調色板匹配的問題,當然也更加好解決了。關鍵是要把問題想通,把握事物的本質,才能找到簡單而優美的解決問題的方法。

  以前我對標準調色板的認識也存在很多錯誤,導致在分析和解決問題上,沒有能找到最好的方法。網上也有許多人寫過有關256色模式下 Alpha Blending 的文章,但是都存在許多認識上的不足,導致最後給出的算法時間和空間的複雜度都太大。我也有過一篇有關256色Alpha混合的文章,但限於當時對事物的認知能力,因此現在看來以前的許多文章是慘不忍睹。大家都在進步,以後有機會再將新的認識寫成文章,同大家分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章