现在的位置: 首页 > 综合 > 正文

关于PNG图像压缩的一点感悟 by cocomo

2014年02月09日 ⁄ 综合 ⁄ 共 1221字 ⁄ 字号 评论关闭

http://j2medev.spaces.live.com/Blog/cns!8D09CFF9FE06ED5D!1027.entry?owner=1

 

今天总算彻底把我的PngerX的J2ME显示端搞定了,又不知道耗掉了多少脑细胞,为我阵亡的脑细胞默哀一分钟

 
        在PngerX中,我把PNG文件多余的区块都滤掉了,只保留了必要的IHDR、PLTE、tRNS和IDAT区块。在IHDR区块中,我原以为只需要图像宽和图像高,色(位)深度可以直接设置为8、颜色类型肯定是索引彩色图像3、其余的压缩方法了什么的都可以设为0,结果运行时报错,我郁闷啊我,这个调试起来太麻烦了,我只有用UE对内存数据和原PNG二进制码进行比较,结果发现原图色深竟然是4,我倒。无奈只有调整文件格式包含色深,运行,图像显示正常
        调色板PLTE区块颜色压缩老是不正确,我采用的是565压缩格式,也就是说把原来8位的红和蓝用5位来表示,8位的绿用6位来表示,所以从24位颜色转565格式应当是乘上对方的标本空间再除以自己的标本空间,算法如下:
        r = ((r * 31 / 255) & 31) << 11;
        g = ((g * 63 / 255) & 63) << 5;
        b = (b * 31 / 255) & 31;
        value = (r | g | b) & 0xFFFF;
 
        从565格式转24位颜色的算法是:
        r = (value >> 11) * 255 / 31;
        g = ((value >> 5) & 63) * 255 / 63;
        b = (value & 31) * 255 / 31;
 
        有许多人都怀疑转换对图片质量造成的影响,结果我打印出了一系列数据说明两次转换后的颜色对比:
转换前:
1  r: 29 g: 26 b: 29
2  r: 146 g: 146 b: 142
3  r: 120 g: 71 b: 46
4  r: 218 g: 249 b: 224
5  r: 45 g: 107 b: 49
6  r: 229 g: 178 b: 130
7  r: 115 g: 172 b: 84
8  r: 140 g: 216 b: 103
9  r: 60 g: 55 b: 60
10  r: 214 g: 38 b: 0
转换后:
1 r: 24 g: 24 b: 24
2 r: 139 g: 145 b: 139
3 r: 115 g: 68 b: 41
4 r: 213 g: 246 b: 222
5 r: 41 g: 105 b: 41
6 r: 222 g: 174 b: 123
7 r: 106 g: 170 b: 82
8 r: 139 g: 214 b: 98
9 r: 57 g: 52 b: 57
10 r: 213 g: 36 b: 0
 
下面是两副转换前后的图片对比:
 
              转换前                            转换后
 
 
        看来差别不大,几乎看不出来
 
        最后又碰到一个IDAT多区块的问题,过去一直以为IDAT只有一个区块呢,谁知道有些图片经过XOperator减色工具后竟然会变成多IDAT区块,我倒。

 

抱歉!评论已关闭.