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搞定。
鸟哥,再论PNG
最新推荐文章于 2024-09-04 14:45:59 发布