天天看點

真彩色轉256色算法

位圖常用的一種壓縮方法。從位圖圖檔中選擇最有代表性的若幹種顔色(通常不超過256種)編制成顔色表,然後将圖檔中原有顔色用顔色表的索引來表示。

這樣原圖檔可以被大幅度有損壓縮。适合于壓縮網頁圖形等顔色數較少的圖形,不适合壓縮照片等色彩豐富的圖形。

在項目中,由于底層驅動改變,原先用于真彩色的buffer改成隻能傳遞256色索引值的buffer。是以,需要壓縮真彩色bitmap為256色。

大緻的算法如下:

A R G B 各8位。

  • 第一次近似替換。我們取像素 RGB的高4位,組成一個12位數,也就是說總共有2的12次方種顔色。采用排序統計,計算bitmap位圖的出現的頻率,算出頻率高的256種顔色。
  • 第二次近似替換。然後把其餘的4096-256種顔色,用平方差或者其他算法,第256之後的顔色在前256種顔色中找一個最接近的顔色做近似替換。也就是說現在4096-256種顔色和頻率較高的256色形成一一對應關系,現在我們把bitmap 24位真彩色轉變成256色。
  • 第三次近似替換。把頻率高的每種顔色在調色闆中找到最接近的顔色的索引值,然後把256色索引值傳給底層驅動。

經過這幾次近似替換,結果相當于,bitmap每個像素會找到256色調色闆中最接近的顔色的索引值。

ps:當時離職的時候,公司不允許保留源代碼,甚至文檔也不允許拷貝出來!經過了快兩年的時間,具體實作也忘得差不多了,現在隻能回想大概思路,有時間再用C語言實作。

繼續閱讀