天天看点

真彩色转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语言实现。

继续阅读