PNGRebuilder

修正:1. ver1.0.1增加了对sRNS数据库的处理.原来只处理了一种特殊情况.

本工具试用范围:在S40种使用了过长过宽的图片,实际上图片越长才越省空间.图片前要求,调色版最多颜色数不超过16,即图片的bitDepth为4.要求背景色为透明(非透明图片解析时,会有问题.).

目前,我们有一些游戏需要移植到nokia S40平台,针对这个需求,我自己写了一个工具:PngRebuilder 这个工具设计思路是:

如果程序中直接利用CreateImage(Sting path),如果是比较长的图片,我目前遇到是1320*40,以前还做过2675*29,这样的图片如果直接用CreateImage(Sting path),系统直接就会内存溢出.

所以,就从PNG方面入手,简单介绍一下PNG 文件格式, 在KVM中,鉴于系统运行要求,一般只对要求的必须块(Critical Data)进行了处理,也就是必须实现的4个文件块,文件头(IHED),调色版(PLTE),数据区(IDAT),文件尾(IEND).所谓能节省内存的思路就是,在对象素点画时,采用逐行扫描,逐行转换,逐行画出. 假如一个点用2个字节,参见Sun KVM Source Example(其它机器可能不一样,列举只是作为参考),而对于NOKIA S40 v1,屏幕是4096色,按照API文档中的规范,猜测一个象素是12位,即1.5BYTE.这样的话,对内存的粗略需求值就是

Memory=width*height*bytesPerPixel;

所以,如果能改变 bytesPerPixel,那就可以省略内存,对于图片,我们可以采用,4色(2*2),8色(2*2*2),16色(2*2*2*2),一般来讲,8色和16色就能满足我们的要求了.这样的话,一个象素点我们只需要保存4bit=0.5Byte,对于标准的,我们省略掉 3/4内存,对于NOKIA 40,省略了2/3内存.

实际上也就是我们用4个BIT表示一个点对于调色版的索引.然后,读取调色版,每行进行转换,逐行画出. 这样的处理速度是否会慢呢?目前在NOKIA S40平台上处理的速度还可以接受.不是特别的慢. 像UNIJA X859,如果手机的CPU,屏幕刷新频率比较低,这种处理方式,就需要各位兄第灵活处理了.

 

<Sun KVM Source example>
typedef struct _pngData {
      signed int   width;
      signed int   height;

    /* current location, for writing pixels */
             int   y;
    unsigned int   scanlength;
    unsigned short bytesPerPixel;

    /* palette in stream is RGB (3 bytes) but we store it as XRGB (int) */
             long *palette;
    unsigned short paletteLength;

    unsigned char *trans;
    unsigned short transLength;

    unsigned char  pass;         /* pass #, for interlace loading        */

    unsigned char  depth;        /* bits per pixel: 1,2,4,8,16           */
    unsigned char  colorType;    /* 1=palette  2=hasColor  4=hasAlpha    */
    unsigned char  compress;     /* compression type, must be zero       */
    unsigned char  filter;       /* filter type, must be zero            */
    unsigned char  interlace;    /* interlacing: 0 (none) or 1 (adam7)   */
    unsigned short lineBytes[7];
    unsigned short passSize[7];
} pngData;

下边我跟兄弟们说说如何用这个工具PNGRebuilder.以及移植S40 V1版本.

打开PNGrebuilder,界面如下: 

然后选择File->Open Png File,打开你要转换的PNG文件,对PNG文件要求,文件色深一定是4(即最多用16种颜色),本程序只对色深为4进行了处理(处理工具可以用Fireworks或者photoshop),这是保证转换的准确性,不满足转化的基本要求,转换菜单将禁用, 通过基本的PNG检测后,选择File-Save Csp File,生成后缀是CSP的文件,这个文件格式是PNG转换后的格式,在J2ME中用的就是这个格式.然后,在选择File-Export java File,生成在J2ME中使用的java文件.推荐文件名:PngReader.java,如果不愿意用这个名字,请按PngReader.java文件名保存,然后进行重构! 在J2ME中,用构造方法创建PNGREADER对象,参数为CSP文件名.

public PngReader(String sFileName)
 {
   
 }
然后,在需要画图片的地方用,这个方法对图片画的时候锚点都是Graphics.TOP|Graphics.LEFT,对特殊的用法,可以修改PngReader.java.
public void drawDataImage(Graphics g,int x,int y)
{
}

工具和源码详见附件! 关于JAR SIZE,本方法不会有明显的改观,因为提取数据区得时候,也是用的LZ77压缩算法,而JAR文件也是采用LZ77压缩算法,本方法去掉了一些对我们不重要的区域,比如辅助区,CRC校验区(每个区4个字节),这些细节省下来的空间没有很明显的改观.

而在移植过程中,就需要对游戏进行改造.改造方法,

 

  • 改造游戏,删除背景图片,对某些类型游戏还可以进行关卡删除等等(对JAR大的应用特别有效).
  • 调整游戏代码,修改程序(这个不是特别有效).
  • NOKIA 40S V2版本的,删除音乐.

以上是我个人的所得,奉献给大家,大家有什么意见,随时在这个议题下补充!权当抛砖引玉!

你可能感兴趣的:(游戏,filter,工具,Nokia,j2me,compression)