关于《质量高解码速度的高彩图象压缩》文章中的方法的改进云风你好!早闻大名了:)
我最近也想实现一种质量高、解码速度快的图片压缩格式,你的文章对我新完成的图片格式影响很大;对于你的方案,我的主要不同处或改进有:支持8bit Alpha通道的32bit RGB真彩色颜色(我的应用中最常见的图片)所有的压缩块共享一个公共调色板(注意调色板可以超个256个颜色);固定为8x8的块,每个块包含64个4bit索引值;并包含该块的调色板入口索引, (也就是说Color=GlobalTable[LocalTablePort+ColorPalletteIndex]);生成调色板时使用16叉树进行颜色量化,质量很好,速度非常快(空间分割算法太慢了!)
一些说明:固定为8x8的块并且所有的块共享调色板表,这样的好处是每个块的调色板颜色数就不必固定为16个颜色,对于颜色数少的块可以进一步节省空间;而且某些情况下可以完全使用前一个块的调色板,调色板空间成本为0!而且使用8x8的块可以很容易逼近原方案中的16x16块分割的压缩:将相邻的4个8x8的块一起进行颜色量化,然后共用这一个调色板;同理,8x8的块也可以很容易的逼近更大块的压缩(边长为8的倍数);这样无论选择多大的块来压缩,生成的最终格式也完全相同;这也有利于算法的编写和优化;而且还可以让用户选择感兴趣的区域;
16叉树颜色量化算法(如果不想支持Alpha通道可以使用8叉树,更详细的算法参见其他图像处理书籍);将需要量化的所有颜色添加到16叉树,然后不断的修剪最近的两个颜色直到颜色数小于等于16(为了压缩也可以再加入一个限制条件“最近的两个颜色差值大于某个允许的误差值”);两个颜色按照颜色数量按比例进行合并为一个颜色; 两个颜色的距离经验公式为(根据人眼对颜色的敏感程度加了权值,Sqr表示平方): Value:= ( Sqr(Color0.B-Color1.B)*2 + Sqr(Color0.G-Color1.G)*4 + Sqr(Color0.R-Color1.R)*3 + Sqr(Color0.A-Color1.A)) * min(Color0Count,Color1Count);
我得到的压缩后的图片质量很好,在16*16模式下测试压缩hc_mm.jpg那幅图片得到的效果都好于原文例子中8*8那幅(hc_mm16c8.png); (不知道怎么帖图:))
在我应用中,因为大量使用alpha通道,所以格式也对此作了优化;在8x8的块数据中增加了一个该块描述信息:比如:是否全部透明、是否全部不透明、是否纯色等;以次来加快Blend速度;对得到的调色板数据和颜色索引数据还可以进一步进行压缩,比如Hufman编码压缩,一般可以进一步压缩35%-50%;在我的测试中,用Hufman压缩后,从载入文件到显示出来会比直接储存的方式快一点;