關於RGB565,RGB555, RGB888,RGB32的轉換,在我的前一篇博文中我已經介紹過了關於RGB565->RGB888的步驟和思想。
今天上午又研究了一個上午,就謝了下來,希望能給需要幫助的哥們一點小小指導,當然了..也期待著高手過來拍磚。
關於RGB的一點介紹:
RGB色彩模式(也翻譯為“紅綠藍”,比較少用)是工業界的一種顏色標准,是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得
到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標准幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。
RGB語法:
( red,green,blue ) 參數red:integer類型,指定顏色中的紅色分量強度,有效值在0到255之間;green:integer類型,指定顏色中的綠色分量
強度,有效值在0到255之間;blue:integer類型,指定顏色中的藍色分量強度,有效值在0到255之間返回值Long。函數執行成功時返回由指定分量確定的顏色,
用長整數表示。發生錯誤時返回-1。如果任何參數的值為NULL,RGB()函數返回NULL。 用法RGB()函數使用下述公式計算表示顏色的長整數:
65536 *Blue + 256 * Green+Red其中,Blue代表藍色分量,Green代表綠色分量,Red代表紅色分量。各分量中,數值越小,亮度越低,數值越大,亮度越高。
下面就言歸正傳了:就RGB各種不同位數的存儲方式在我的博客http://3417300.blog.51cto.com/3407300/860523中可以找到,在這我就不再累贅了。
就RGB888->RGB565而言:其轉換的具體思路如下:(注:只代表個人的方法)
1.取RGB888中第一個字節的高5位作為轉換後的RGB565的第二個字節的高5位
2.取RGB888中第二個字節的高3位作為轉換後的RGB565第二個字節的低3位
3.取RGB888中第二個字節的第4--6位,作為轉換後的RGB565第一個字節的高3位
4.取RGB888中第二個字節的第三個字節的高5位作為轉換後的RGB565第一個字節的低5位
就RGB565->RGB888而言:
RGB565的存儲方式為:
R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0
1.取RGB565第一個字節中低5位作為RGB888的高5位
2.取RGB565第二個字節中的低3位,將其左移5位,作為RGB888第二個字節的高5位
3.取RGB565第一個字節的高3位將其右移3位,作為RGB888第二個字節的4--6位
4.取RGB565第二個字節中的高5位作為RGB888第三個字節。
細心地哥們一定會發現如果我們是低位往高位上轉的話,就存在一些數據精度的丟失問題,在網上查了寫資料,借鑒了一下別人的方法;所謂的量化補償,
講一下量化壓縮與量化補償吧
在進行色彩格式轉換的時候,經常會遇到色彩量化位數的改變,比如說從 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. 如果仍然有未填充的位,繼續使用原始數據的低位進行循環補償
本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/860798