ETC1壓縮算法詳解

美女

0. Ericsson 壓縮算法官方 GitHub

ETCPACK

1. 基本思想

  • ETC 壓縮算法的基本思想
    將圖片分成 4x4 的若干個(gè)像素塊嗅骄,每個(gè)像素塊按照一定規(guī)則編碼成為一個(gè) 64 位(8字節(jié))的數(shù)據(jù)戏自,大概的想法是計(jì)算像素塊的平均顏色辣之,然后記錄這個(gè)平均顏色和每個(gè)像素相對(duì)平均顏色的差值徒像,平均顏色只耗費(fèi)了一個(gè)像素的數(shù)據(jù)轮纫,而差值也并不記錄完全真實(shí)的差值,而是從一個(gè)固定的靜態(tài)數(shù)據(jù)中找到最接近的差值(RGB三個(gè)通道差值一樣)舷蟀,每個(gè)像素只需要記錄其差值在靜態(tài)數(shù)據(jù)中的索引即可冒版。

  • 壓縮比
    對(duì)于 RGB24 圖片,每個(gè)塊的數(shù)據(jù)由 4x4x3 = 48字節(jié)歌殃,壓縮為 8字節(jié)乔妈,壓縮比為 6:1,針對(duì)Alpha圖片氓皱,由4x4x1 = 16字節(jié) 壓縮為 8 字節(jié)路召,所以勃刨,對(duì)于普通的 RGBA 分離為 RGB24 和 Alpha 之后分別進(jìn)行 ETC1 壓縮的圖片,整體壓縮比為 (48 + 16) : (8 + 8) = 4:1

  • 文件頭數(shù)據(jù)
    除了編碼后的數(shù)據(jù)塊之外股淡,還會(huì)存儲(chǔ)一部分文件頭數(shù)據(jù)身隐,用來表示文件的特征碼、寬高等

2. 像素塊編碼思想

如何將一個(gè) 4x4 的像素塊編碼為 64 位數(shù)據(jù)呢?

  • 將 4x4 的像素塊分為兩個(gè) 4x2 的子塊唯灵,有水平豎直兩種分法贾铝。使用 1位數(shù)據(jù)flipbit來表示是哪一種分法,還剩下 63 位數(shù)據(jù)
    flipbit表示子塊分法
  • 分別計(jì)算兩個(gè)分塊中 8 個(gè)像素顏色的平均值埠帕,根據(jù)兩個(gè)塊顏色平均值的差值垢揩,確定使用 individual模式還是 differential 模式。使用 1位數(shù)據(jù)diffbit來表示是哪種模式敛瓷,還剩下 62位數(shù)據(jù)

  • 存放兩個(gè)子塊的平均顏色信息叁巨,individual模式用R4G4B4 的格式分別表示兩個(gè)子塊的平均顏色,differential 模式使用 R5G5B5 格式表示第一個(gè)子塊的平均顏色琐驴,R3G3B3 格式表示第二個(gè)子塊與第一個(gè)子塊平均顏色的差值俘种。這里使用了 8 * 3 = 24 位數(shù)據(jù),還剩下 62-24 = 38 位數(shù)據(jù)

可以這么理解:當(dāng)兩個(gè)子塊的平均顏色值相差比較小時(shí)绝淡,基本顏色可以使用更高精度的 R5G5B5 來替代R4G4B4獲得更少的信息損失

  • 所有的圖片共享一個(gè)全局的映射表數(shù)據(jù),這個(gè)數(shù)據(jù)是固定的全局靜態(tài)數(shù)據(jù)苍姜,并不會(huì)進(jìn)入到編碼數(shù)據(jù)中牢酵,這個(gè)表是一個(gè) 8 x 4 的二維數(shù)組,使用 3 位數(shù)表示第一個(gè)子塊在映射表中查詢的第一維索引衙猪,需要3位來表示 0-7 的下標(biāo)馍乙,第二個(gè)子塊同樣需要 3 位數(shù)來表示,還剩下 38-3*2 = 32位數(shù)據(jù)

  • 4x4像素塊中的每個(gè)像素垫释,使用2位數(shù)來表示該像素在映射表中查詢的第二維索引丝格,需要2位數(shù)來表示0-3的下標(biāo),所以消耗了 4x4x2 = 32 位數(shù)據(jù)

以上就是編碼后的 64 位數(shù)據(jù)塊表示的意義

3. 內(nèi)存布局和解碼過程

以RGB555基本色和RGB3333顏色差表示的編碼為例棵譬,每個(gè)4x4 像素塊經(jīng)過ETC1 編碼后的 64 位數(shù)據(jù)的內(nèi)存布局大概是這樣


ETC1內(nèi)存布局

假如編碼前像素塊表示為下圖


目標(biāo)像素

我們需要得到圖中編號(hào)2對(duì)應(yīng)像素的顏色显蝌,需要進(jìn)行如下的解碼步驟:

  • 獲取目標(biāo)所在的子塊
    根據(jù)第32位 flipbit 標(biāo)志位,知道這個(gè)像素塊采用的是橫版劃分子塊订咸,2號(hào)像素處在子塊2中

  • 獲取子塊1基本顏色
    首先根據(jù)第 33 位 diffbit 標(biāo)志位得知曼尊,這里采用的是 R5G5B5 基本色 + R3G3B3 差值的方式。分別從59-63位(11100)脏嚷、51-55位(00100)和43-47位(00011)讀取子塊1基本色 RGB1=(11100, 00100, 00011) = (28, 4, 3)

  • 獲取子塊2的顏色差值
    這里是 differential 模式骆撇,所以需要讀取子塊2的顏色差值,從56-58位(100)父叙、48-50位(010)和40-42位(000)獲得顏色差值 RGB_offset=(100, 010, 000) = (-4, 2, 0)神郊,注意這里的3位數(shù)據(jù)中最高位是符號(hào)位肴裙,所以差值部分的取值范圍是[-4, 3]

  • 計(jì)算子塊2的基本色
    將子塊1基本色和子塊2差值相加,得到子塊2的基本色涌乳,RGB2=RGB1 + RGB_offset = (28 - 4, 4+2, 3+0) = (24, 6, 3)蜻懦,轉(zhuǎn)為5位二進(jìn)制表示為 RGB2=(11000, 00110, 00011)

  • 擴(kuò)展子塊2基本色分量為8位
    對(duì)5位標(biāo)識(shí)的基本色補(bǔ)位為8位表示,得到 RGB1 = (11000110, 00110110, 00011011) = (198, 54, 27)爷怀,這就是子塊2的基本色

補(bǔ)位規(guī)則:

individual 模式阻肩,直接將4位數(shù)復(fù)制到尾部,得到8位
differential 模式运授,將5位中的高3位復(fù)制到尾部烤惊,得到8位
differential 模式,一定是將子塊1基本色和子塊2偏移值相加后再進(jìn)行補(bǔ)位

  • 獲得目標(biāo)像素的顏色偏移值
    目標(biāo)像素下標(biāo)為2吁朦,在編碼數(shù)據(jù)的第2位得到映射表的下標(biāo)的低位(lsb)為1柒室,第18 位得到映射表的下標(biāo)高位(msb)為1,假如使用如下的映射表逗宜,則可以得到映射表下標(biāo)為(lsb, msb)=(1,1)雄右,對(duì)應(yīng)下標(biāo)為 -b


    映射表

這里的映射表是一個(gè)全局?jǐn)?shù)據(jù),不會(huì)編碼到文件中纺讲。但是這個(gè)全局?jǐn)?shù)據(jù)是怎么來的擂仍,放在什么地方,沒有查到相關(guān)資料熬甚。不過因?yàn)榻獯a時(shí)要用逢渔,所以我估計(jì)是存放在紋理的某個(gè)全局區(qū)域

上面知道目標(biāo)像素位于子塊2,這里還需要從編碼數(shù)據(jù)的34-36獲得子塊2的修正表索引乡括,得到索引為(1,1,0)=6肃廓,根據(jù)上面的映射表,根據(jù)下標(biāo)(6, -b) 可以索引到像素的顏色差值為-106

  • 計(jì)算目標(biāo)像素的最終顏色值
    這里RGB三個(gè)分量的差值相同诲泌,目標(biāo)像素最終的顏色值為子塊2的基本顏色 + 目標(biāo)像素的顏色偏移值:
    RGB_target = RGB2 + (-106, -106, -106) = (198 - 106, 54 - 106, 27 - 106)盲赊,修正后得到目標(biāo)顏色值 RGB_target = (92, 204, 177)

4. 編碼過程

其實(shí)從上面的解壓過程可以推測(cè)出編碼的過程

  • 將圖劃分為4x4的像素塊,如果不夠4x4敷扫,則將這些像素填充在4x4塊的左上角哀蘑。
  • 針對(duì)每個(gè)4x4的像素塊嘗試以下編碼,取解碼后和原像素差值最小的那種編碼作為結(jié)果呻澜。
    (1)確定flipbit递礼,并計(jì)算兩個(gè)子塊的平均顏色值,這里我猜測(cè)是先將8個(gè)像素的R8G8B8取均值得到像素的平均值羹幸,然后將每個(gè)分量的后三位直接拋棄脊髓,得到R5G5B5
    (2)根據(jù)兩個(gè)子塊顏色值的差值,確定diffbit栅受,根據(jù)上面得到的兩個(gè)子塊的 R5G5B5将硝,計(jì)算差值恭朗,如果差值在[-4, 3] 之間,說明差值可以用3位帶符號(hào)的二進(jìn)制數(shù)表示依疼,可以用differential模式痰腮,否則用 individual 模式
    (3)枚舉不同的子塊索引,確定每個(gè)子塊使用映射表中的哪一組偏移值
    (4)枚舉每個(gè)像素的映射下標(biāo)律罢,確定像素使用映射表中的哪一個(gè)偏移值
    (5)針對(duì)第3步和第4步的枚舉膀值,可以得到很多組不同的編碼,將編碼結(jié)果解壓后和原始像素?cái)?shù)據(jù)對(duì)比误辑,取相差最小的一組編碼作為最終結(jié)果
  • 將圖片中各個(gè)像素塊編碼合并

4. 遺留或未考查清楚的問題

  • 映射表里的數(shù)據(jù)是怎么確定的沧踏?映射表數(shù)據(jù)存放在哪里?
  • 取子塊平均色時(shí)巾钉,原本R8G8B8的數(shù)據(jù)是怎么壓縮成R5G5B5的翘狱?
    是直接拋棄后三位嗎?
    還是按照比例來壓縮?比如 8 位時(shí) 11111111 表示 256砰苍,5位時(shí) 111111(實(shí)際值是31) 表示256潦匈,原本8位時(shí)的值 x,則5位時(shí)的y值赚导,y= x * (31/256) 取整得到的5位二進(jìn)制表示茬缩?從解碼的補(bǔ)位過程看起來應(yīng)該是直接拋棄掉后三位。后三位的數(shù)據(jù)其實(shí)就損失了吼旧。

參考:
UI圖集壓縮優(yōu)化寒屯,以及對(duì)Dither和ETC1算法的深入了解
幾種主流貼圖壓縮算法的實(shí)現(xiàn)原理詳解
OES_compressed_ETC1_RGB8_texture

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市黍少,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌处面,老刑警劉巖厂置,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異魂角,居然都是意外死亡昵济,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門野揪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來访忿,“玉大人,你說我怎么就攤上這事斯稳『C” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵挣惰,是天一觀的道長(zhǎng)卧斟。 經(jīng)常有香客問我殴边,道長(zhǎng),這世上最難降的妖魔是什么珍语? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任锤岸,我火速辦了婚禮,結(jié)果婚禮上板乙,老公的妹妹穿的比我還像新娘是偷。我一直安慰自己,他們只是感情好募逞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布蛋铆。 她就那樣靜靜地躺著,像睡著了一般凡辱。 火紅的嫁衣襯著肌膚如雪戒职。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天透乾,我揣著相機(jī)與錄音洪燥,去河邊找鬼。 笑死乳乌,一個(gè)胖子當(dāng)著我的面吹牛捧韵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汉操,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼再来,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了磷瘤?” 一聲冷哼從身側(cè)響起芒篷,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎采缚,沒想到半個(gè)月后针炉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扳抽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年篡帕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贸呢。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镰烧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出楞陷,到底是詐尸還是另有隱情怔鳖,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布猜谚,位于F島的核電站败砂,受9級(jí)特大地震影響赌渣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昌犹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一坚芜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斜姥,春花似錦鸿竖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杈笔,卻和暖如春闪水,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒙具。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工球榆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人禁筏。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓持钉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親篱昔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子每强,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • JPEG文件的存儲(chǔ)格式有很多種,但最常用的是JFIF格式州刽,即JPEG File Interchange Forma...
    hehtao閱讀 9,176評(píng)論 1 7
  • 簡(jiǎn)介 貼圖為圖形顯示效果增添了豐富的表現(xiàn)與細(xì)節(jié)空执,是增強(qiáng)圖形效果真實(shí)性與美觀性的重要元素,但同時(shí)由于包含了大量的信息...
    離原春草閱讀 3,908評(píng)論 0 4
  • JPEG文件簡(jiǎn)介 JPEG的全稱是JointPhotographicExpertsGroup(聯(lián)合圖像專家小組)穗椅,...
    zhoulujun閱讀 1,135評(píng)論 0 1
  • 參考為什么需要紋理壓縮移動(dòng)端紋理壓縮格式干貨:Unity游戲開發(fā)圖片紋理壓縮方案Creator使用壓縮紋理常用紋理...
    合肥黑閱讀 25,645評(píng)論 0 17
  • 一脆烟、系統(tǒng)架構(gòu) 本文以一個(gè)實(shí)際的產(chǎn)品為例,來說明 JPEG 在其中的應(yīng)用房待。 image 本系統(tǒng)為一個(gè)嵌入式 Linu...
    東方詩空閱讀 7,277評(píng)論 0 16