鸟哥,再论PNG

  png图片格式定义是20世纪90年代中期的事了。它的IDAT块使用的LZ77算法(java自带的java.util.zip.DeflaterIn(Out)putStream有实现之)也派生出很多算法,很多压缩率都更高,如7z用的LZMA算法,号称最大压缩率算法。在手机资源如此稀缺的情况下,是可以考虑做一些改变。
  png格式,手机游戏,一般png8就足够了,8为2的8次方256,实际上已经浪费了一半,因为它实际只容纳128个颜色,一个byte嘛,128就成-128了。把IHDR里的长度宽度,色深等几个提取出来,把色盘(记为a)提取出来;利用他们用L7zz算法解压出IDAT块(注意可能有几块哦),再还原出原来数据;这些数据是什么?这些数据是一维byte数组(针对png8哈),长度为总像素数(即是图宽乘长)(记之为b),下标index,index % width,index/width就是图中的(x,y),那么a[b[index]*3]就是(x,y)的RGB中的R值,a[b[index]*3+1],a[b[index]*3+2]为G,B值。再根据tRNS确定哪个色是透明的,一般是最后一个色值。
a这块数据,可以把透明的标记成-1或者其他非索引b的就可以了,发现是-1值,就是透明的。把长宽色盘a和b一起用LZMA压缩,省多少空间,很可观吧?
  7z官网上有LZMA压缩和解压缩算法,解压缩算法5个类(当然内部类也有几个,鸟哥观察,人家肯定不是java人员写的)左右,完全可以移植到j2me上。
  这样图片,完全脱离了png格式,可以保护图片,可以省去png标记块名等一些格式上的字节。
  最后使用这些数据时,用Image.createARGB搞定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值