基于移动设备的PNG图片优化实现

摘要:随着硬件技术的发展,移动设备的性能获得很大的提高。在移动设备上我们已经可以使用各种图像、音乐资源。目前在图片的使用上局限在几种格式,PNG自身的一些优点使其在移动设备上获得广泛的应用。移动设备应用程序的开发需要用到大量的图片资源,而这些对于程序员来讲是比较难于管理的。为图片资源开发一个可以方便读取的包文件结构,对图片进行打包,并提供相关方法接口,可以节约程序员的编码时间,同时可以方便对图片的读取管理。由于PNG图片的数据结构中部分数据块是可选的,这些数据块并不影响图片在移动设备上的表现效果,对PNG进行适当的处理可以有效的减少占用空间,优化移动设备上的图片应用。

关键词:移动设备;PNG图片;图像打包管理

中图分类号:TP319文献标识码:A文章编号:1009-3044(2008)27-2070-03

Based on Mobile Devices Optimized to Achieve the PNG Image

XU Yi-qing, LIU Lin

(Nanjing Forestry University,Nanjing 210037,China)

Abstract:With the development of hardware technology, the performance of mobile devices have greatly improved, on mobile devices we can use some kinds of images and music resources. At present, we can only use several formats. PNG is used widely by its benefits. Mobile device application development requires a great deal of resources picture, which is more difficult to manage in terms of for the programmer.

Developing a package structure for the image resources which can be read easily, packaging the images, and provide interfaces, it will help the programmers to save their time , and they can manage the read of images easily . For more, some data chunks of PNG is unnecessary, so we can delete them to save storage space, it is helpful for the use of images on mobile devices.

Key words: mobile devices;PNG;image package management

1 PNG文件处理算法程序

经过分析,我们知道PNG图片中存在较多的可选数据段,而这些数据段对于手机上的应用不是必须的。经过测试,剔除这些可选数据段不会影响图片在移动设备上的显示。所以可以寻找一种方法将PNG图片进行处理,只保留其中必须的数据段,PNG图片中可选数据段大小在30—100K左右,所以这样的处理相对手机比较有限的存储空间来说将节约比较客观的存储空间。

经过分析,我们知道以下数据段是非必须的:

cHRM gAMA sBITbKGD hIST tRNS oFFs pHYs

sCALtIME tEXt zTXt fRAc GIFg GIFt GIFx

所以在PNG应用于手机程序之前可以先剔除这些数据。

需要注意的一点是,因为这些数据段不是必须的,所以并不是所有PNG图片中都包含这些数据段。这样如果考虑剔除的话,对于数据段的遍历将浪费时间,影响效率,而必选数据段只有四个,这样选择对必选数据段进行遍历并提取数据写成新的PNG文件在效率上会有很大改进。

可以将PNG文件结构简化描述为表1所示。

处理算法代码为:

读取头部信息,写入新文件:

buff=newbyte[8];

fis.read(buff,0,8);

fos.write(buff);

booleanbool1=true;

while(bool1){

bytebuf[]=newbyte[4];

booleanbool=true;

while(bool){

intn=dis.readInt();//长度

System.out.println(n);

dis.read(buf,0,4);//数据段名称

System.out.println(newString(buf));

if(b[0].equals(newString(buf))||b[1].equals(newString(buf))||b[2].equals(newString(buf))){

System.out.println("2"+newString(buf));

dos.writeInt(n);

dos.write(buf);

bytefbuff[]=newbyte[n+4];

fis.read(fbuff,0,n+4);//读取IHDR块数据及CRC数据

dos.write(fbuff);

bool=false;

elseif(b[3].equals(newString(buf))){

System.out.println("2"+newString(buf));

System.out.println(n);

dos.writeInt(n);

dos.write(buf);

bytefbuff[]=newbyte[4];

fis.read(fbuff,0,4);//读取IHDR块数据及CRC数据

dos.write(fbuff);

bool=false;

bool1=false;

else{

dis.skip(n+4);//同时跳过字节CRC验证码

}}}

图片经过处理后占用空间明显缩小,但是只是处理图片并不能实现对图片的管理和封装,使用包文件结构将能对文件进行有效的封装管理。

2 使用包文件的优点

2.1 节约存储空间

当用户创建一个文件时,Windows操作系统会请求相应的文件系统(FAT/FAT32/NTFS)创建文件,虽然扇区是磁盘最小的物理存储单元,但由于操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理(每个簇可以包括2、4、8、16、32或64个扇区)。显然,簇是操作系统所使用的逻辑概念,而非磁盘的物理特性。为了更好地管理磁盘空间和更高效地从硬盘读取数据,操作系统规定一个簇中只能放置一个文件的内容,可以说文件的存储是以簇为单位的,也就是说一个文件要占用一个或多个簇,而簇是多个扇区构成。如果一个簇只有一个字节被一个文件占用,那么该簇的其他部分即使是空闲的,也不能被别的文件所利用,这样空间就被浪费了。

而在移动设备中,同样存在类似问题。而我们在移动设备中使用图片资源时,图片数量是大量的,而且由于移动设备的存储限制和性能限制,这些图片本身通常是比较小的,在手机上应用的图片通常在1K左右,有些甚至小于1K,所以在磁盘占用方面1K的文件将浪费掉一定的簇空间,所以大量小图片单个存储的话会浪费相对手机有限存储资源来讲较多的存储空间,如果将如此多的小文件合并成一个文件,这样就能有效的节约空间。使用一定的包文件结构可以有效的实现。

2.2 方便管理

由于文件数量庞大,所以当程序员需要使用图片时,需要不停的使用createImage()方法进行画图操作,这样是极其浪费时间的,而且重复的劳动在这里变得没有意义,将文件打包后,为程序员提供一个有别于J2ME的createImage()方法的createImage()方法,使程序员可以单独使用其中某一张图片,或者使用其中的几张图片,这样将节约大量的编码时间。

2.3 加密数据,防止用户恶意篡改

在以往的图片使用中,图片被放在一个文件夹中,这样其他人很容易就能看到图片的具体内容并进行修改。使用包文件结构后,可以有效对文件进行加密,防止用户对文件内容的恶意篡改。

2.4 包文件结构设计

使用UltraEdit来打开一些包文件和其他如图片文件来分析文件打包格式。为了得到更好的分析结果,我使用比较简单的TXT文件进行打包,而且文件数据为“123”。打包为RAR文件。

发现文件头部数据为Rar!,而且这是所有RAR压缩包的头部标志。头部标识与第一个文件1.txt之间的数据缺乏参考资料,不清楚是什么内容。根据网上一些论坛提供的打包结构,推断为文件个数和其他描述内容。个人推断出一种打包结构,即头部标志,文件个数,文件名,文件长度,文件数据,文件名,文件长度,文件数据,尾标志。

包文件结构如表2所示。

头部标志:

用于在读取包文件时对文件格式进行判断,头文件标志为!lx

文件数目:用于存储打包的PNG图片数目,长度为4字节,可以用DataOutputStream的writeInt()方法写入数据。

文件名长度:由于系统支持的文件名长度最多为128字节,所以用1个字节存储长度足够。

文件名:不定长数据。

文件大小:长度4字节,可以用DataOutputStream的writeInt()方法写入数据。

文件数据:存储PNG文件数据。

3 性能测试

基于以上的打包程序,下面称采用本文的打包程序的相应结果称为LX文件。

3.1 PNG处理测试

针对移动设备运用,选择了一组用于手机游戏开发的PNG图片进行测试,分别对选用一定图片数量进行测试对比如表3所示。

如图2,经过测试对比,图片处理前后的大小相差很多,但是结果是不稳定的,这主要因为图片处理算法是提取必选数据段,体积减小多少取决于图片中可选数据的多少,在美工制作图片的过程中,由于图片的修改过程并非全部一致,所以可选数据段的多少是不确定的。但是无论图片可选数据存在多少,可选数据总是存在,通常在20%--50%左右,所以尽管处理结果不稳定,要对体积减少的目的已经达到。

3.2 LX与主流打包压缩格式对比

目前最流行的压缩文件格式有zip和rar,因为首选和这两款主流产品进行对比。

LX文件是不经过压缩的,因为移动设备图片本身比较小,而且经过本文算法处理后变的更小,下面来对比一下三类格式的大小。

经过比较发现在少量文件情况下,LX与WINRAR和ZIP文件大小相差不多,随着文件数量的增加,LX文件渐渐的比WINRAR和ZIP文件大了许多,原因可以理解,因为无论RAR和ZIP都是经过压缩的,而LX是不经压缩的,当文件数量少时,数据重复量较少,WINRAR和ZIP压缩算法的作用不能得到很好的体现,所以文件大小相差不多,当数据量较多时,必然存在较多的重复数据,特别是对于图片,大量色彩数据的重复使RAR和ZIP的压缩算法得到良好运用。

3.3 使用LX的意义与价值

经过对比我们发现LX和RAR和ZIP的对比是没有任何优势可言的,但是在移动设备应用上还是选择使用LX,这是因为,相对存储能力,移动设备的运算能力也受限制,当包文件使用了压缩算法后,必须要进行解压缩的运算才能读取数据,这样要提取包中任何一个文件时都要进行整个包的解压缩运算,这样将耗费CPU的大量运算时间,严重影响设备性能,而就存储方面而言,一个应用程序的图片大概在500-1000张左右,这样经过处理后,和压缩的包文件相比相差在0—500K之间,也就是舍弃500K的存储空间去换取更高的运算效率,当然这仅仅是针对与RAR和ZIP的对比来讲。针对移动设备目前的应用来讲,非但没有占用更多的空间,又节省了大约50%左右的存储空间。

4 结束语

本文主要致力于手机应用PNG图片的优化处理,对于PNG图片进行了比较详细的分析,并提出了一种可以有效减少针对手机应用的PNG图片大小的算法。提供对图片进行打包的算法以及包文件结构。在包内具体图像文件的读取方面提供了相应的接口方法,可以使程序员更方便的读取图像。目前移动设备图片应用的主流格式PNG,在移动设备应用中,大量的小图片难于管理,并造成存储空间的浪费,而且在程序员编程过程中,因为对每一张图片进行读取生成,造成大量代码冗余,影响工作效率。

而根据PNG文件的具体数据结构的分析,实际中可以剔除PNG文件中的无用数据段,以减少文件体积的方法,提取其中必选数据段写成新的PNG文件。而图片处理后并不影响在移动设备上的显示效果。因此需要设计一种简单的打包算法,对大量PNG文件进行打包,有效减少小文件对存储空间的浪费,并提供按文件名读取和按包内文件序号读取两种方法,方便对图片的读取。在对图片的保护方面也起到一定作用,防止用户可以轻易更改图片。

由于时间有限,仅仅做了针对PNG图片的处理,随着硬件技术的提升,未来移动设备将会有更大的发展,意味着在未来移动设备的硬件平台上将可以使用更为丰富的资源。也可以尝试对各种图片资源进行处理,要熟悉各种图片数据结构,针对应用编写处理算法,并对算法进行封装。使该处理可以应用于多种图片类型。也可以考虑提供图片格式转换,转换为PNG图片后进行处理,相对来说前者效率更高。在文件名存储方面,未考虑中文文件名编码问题,在实际操作中中文图片名称不能正确读取。数据块取舍方面tRNS 可以选择,这个数据块会影响到图片透明的处理。文件头部和尾部可以剔除,在实际使用时进行添加,可以有效的节约一定存储空间。但同时也耗费CPU运算时间,存储和运算可选其一。

参考文献:

[1] (美)Bruce Eckel.JAVA编程思想[M].陈昊鹏,译.北京:机械工业出版社.

[2] Herbert Schildt.JAVA2参考大全[M].张玉清,吴溥峰,等,译.北京:清华大学出版社.

[3] PNG文件格式白皮书[EB/OL].https://www.w3.org/TR/REC-PNG.html.

[4](美)Mark Allen Weiss. 数据结构与问题求解Java语言描述[M].翁惠玉,严骏,等,译.北京:人民邮电出版社.

[5] (美)约翰逊. J2EE设计开发编程指南[M].魏海萍,等,译.北京:电子工业出版社.

[6] (美)霍斯特曼, (美)科奈尔. JAVA2核心技术卷[M].北京:机械工业出版

[7] 张云涛,龚玲.Eclipse精要与高级开发技术[M].北京:电子工业出版社.

[8] (美)萨洛蒙,吴乐南,译.数据压缩原理与应用[M].2版.北京:电子工业出版社.

[9] 马平.数字图像处理和压缩[M].北京:电子工业出版社,2007.

[10] (日本)米川英树.J2ME MIDP手机游戏程序设计[M].博硕文化,译.北京:中国铁道出版社,2005.

推荐访问:优化 设备 图片 PNG