站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题PngMate使用教程

PngMate使用教程

摘要: PngMate使用教程
<tr><td>

[本文章最后由 rocks 在2006-02-15 17:54:16编辑过]

http:///tech/article849.html
PngMate使用教程

PngMate是一个非常实用的命令行图像转换工具,它提供的大部分功能几乎就是为了开发手机游戏而量身定制的。

下载PngMate

PngMate有以下一些功能特点:
1 去掉PNG中的一切冗余数据,在不影响图像质量的前提下极限压缩PNG图片,经验证生成的PNG比使用ImageOptimizer等优化工具优化过的PNG图片还要小
2 可以任意指定输出PNG图片的颜色数,以牺牲图像质量为代价进一步缩小PNG图片
3 可把动画GIF的多帧自动提取出来生成平铺的单张PNG
4 也可以切分输入的单帧图片成为多帧
5 可以对帧序列进行复杂的操作
6 可以把切分图片后的生成的帧序列重新生成动画GIF
7 可以针对每帧进行放缩、切割等操作,且可以自动运算以进行最大限度的切割
8 PngMate是命令行工具,可以轻易实现批处理或整合到工程创建脚本中
9 其它小的特色,如改变透明背景色,在帧上加注编号等

PngMate是命令行工具,和大部分人习惯使用的有界面的的软件有所不同,下面向大家介绍一下PngMate的典型使用方法。
[]
为了在任何一个目录下面都能执行PngMate,我建议大家把PngMate.exe放在C:\Windows(如果是Win2K则是C:\WinNT)这个目录下面,这样最简单,什么也不用设置。当然也可以在"控制面板->系统->高级"里面把PngMate.exe所在的目录加入到环境变量PATH里面去,这样效果是一样的。

[]弄好以后,就可以使用"开始->程序->附件->命令提示符"或者"开始->运行->输入cmd"打开一个命令行窗口来使用PngMate了,在命令行窗口的命令提示符后输入pngmate,然后回车,看看是不是有中文帮助出来,如果没有,可能是你的机器没有安装JRE(Java运行环境),因为PngMate是用Java开发的。那么去下载一个JRE(要1.4或更高版本才行)安装上就应该可以了。JRE可以在这里下载。


通常我们制作手机游戏中的动画时,都是用ImageReady等工具先做成动画gif,因为这样可以看到动起来的效果。可是J2ME并不支持动画gif,所以只好在做完以后把gif的每一帧排列到一张大的png图片上,然后在程序里面再切割png来显示成一帧一帧的效果。这个把gif转成png的过程虽然没啥难度,不过每次每次的重复弄,还是挺麻烦的。用PngMate就简单了,比如下面的例子:

[]pngmate boy.gif boy.png

boy.gif
540) this.width = 540'>
boy.png
540) this.width = 540'>
[]ACDSee中看到的boy.png
540) this.width = 540'>
[]


生成的图片默认都是有透明色的,如果你用ACDSee等软件打开PngMate生成的图片,会发现透明的部分显示的是绿色,不要担心,实际在J2ME里绘制图片的时候,绿色的背景是不会出现的。在大多数情况下,绿色背景能很好的和画面中的有效部分区分开,哪里透明哪里不透明让你一目了然,不过有些图片—比如树木—里面本身有不少绿色的部分,这个时候用ACDSee看上去可能就和绿色的背景融为一体了,那么我们可以用-trans 来改变透明色的背景,比如使用洋红色FF00FF:

pngmate boy.gif boy1.png -trans FF00FF

boy1.png
540) this.width = 540'>
ACDSee中看到的boy1.png
540) this.width = 540'>


boy.gif里面第三帧实际上和第一帧是一样的,在内存寸土寸金的J2ME程序中,我们怎么能容忍这样的浪费?好,我们用帧序列处理命令delete命令来把多余的帧删掉,不过要记住在PngMate中,帧是从0开始编号的,也就是说第三帧的编号是2,因此:

[]pngmate boy.gif boy2.png -delete 2

boy2.png
540) this.width = 540'>


boy.gif是64x64的图片,可是里面的小男孩实际上的大小却没有那么大,png文件是压缩过的,所以透明的空白部分在png文件中增加不了几个字节,但是可以想见,在游戏的运行时刻,内存中保存的肯定是未压缩的像素数组,那么这些空白部分就要消耗实实在在的内存!因此把这些空白边界切掉绝对是有实际意义的,那么我们就用PngMate的crop功能来把输入图片的有效部分切出来:

pngmate boy.gif boy3.png -delete 2 -crop 48x52+8+10

boy3.png
540) this.width = 540'>


不过这样好像还是有一些空白可以切掉,但是用目测的方式一个像素一个像素的调整确实太费劲了,如果能自动运算找出包含所有有效像素的最小矩形那是最好不过的,pngmate非常体贴的也帮你想到了这点哦!只要采用贪婪切割策略就可以了:

pngmate boy.gif boy4.png -delete 2 -crop greedy

boy4.png
[] 540) this.width = 540'>


下面我们来换一张图片,街头霸王Ken,这张gif的帧数比较多,默认输出排成一行看着费劲,那么可以用align命令来指定一行的帧数,指示PngMate输出成多行:

pngmate ken.gif ken.png -align 6
[]
ken.gif
[] 540) this.width = 540'>
ken.png
540) this.width = 540'>


ken.gif直接转成的ken.png体积比较大,而且我们实际做游戏根本用不到这么大的角色,那么可以用resize来改变帧的大小,我们在下面的例子里高度指定为0,意思是根据给定的宽和原图的比例自动运算出新图片的高:

pngmate ken.gif ken1.png -resize 64x0 -align 6

ken1.png
540) this.width = 540'>

[]
可是这样生成的png还是有点大,我们可以用frameskip来跳过一部分帧,这样动作虽然不如原来流畅,但是图片体积也相应大大减小了:

pngmate ken.gif ken2.png -resize 64x0 -frameskip 1

ken2.png
540) this.width = 540'>

[]
好,小了将近一半了,再想缩小图片,可以采用减少图片使用的颜色数的办法,一般来说,使用的颜色越少,图片体积越小,当然相应的图像质量也会下降,不过我们完全可以多试几次,在图片体积和图像质量中达到一个最佳平衡点:

pngmate ken.gif ken3.png -resize 64x0 -frameskip 1 -colors 40

ken3.png
540) this.width = 540'>


怎么样,虽说图像质量稍有下降,但看上去并没有比ken2.png差太多,不过体积可又减小了将近一半!

做完了这些工作,是不是很想看看现在的缩小版Ken动画的实际效果?再转回动画gif当然是最直接的办法,不用求助美工,pngmate一样帮你搞定!采用split命令可以把输入的图片切分成多帧,而我们的ken3.png只有一行,这一行上水平排列了6帧,所以应该切分成6列 x 1行,因此用下面的命令行:

pngmate ken3.png ken1.gif -split 6x1

ken1.gif
540) this.width = 540'>


还不错吧?不过看上去比原来的动作慢了一点,这是因为没有指定gif的帧间延迟,所以PngMate采用了默认值200毫秒(每秒5帧),对我们的动画来说确实慢了一些,没关系,可以用delay命令来指定输出gif的帧间延迟:

pngmate ken3.png ken2.gif -split 6x1 -delay 150

ken2.gif
540) this.width = 540'>


怎么样,是不是感觉好多了?

我们刚才处理的小男孩图片现在也来看看动态效果,但是想起来没有,我们刚才删除了其中一个重复帧,这样如果直接生成gif的话,动作就不连贯了,怎么办呢?别急,pngmate还提供了帧序列处理命令select,可以用它来选择部分帧,而且帧序号可以重复哟,所以只要用下面的命令就可以做到:

pngmate boy4.png -split 3x1 boy1.gif -delay 150 -select 0,1,0,2

boy1.gif
540) this.width = 540'>


大家可以从上面的例子里看到,pngmate对参数的顺序要求是很宽松的,可以像前面的例子一样,把命令可以写在输入、输出文件的后面,也可以写在它们的前面甚至中间。但是crop和resize命令如果组合使用,那么处理的顺序就是命令行中它们出现的的先后顺序。同样,对于frameskip, select, delete这三个帧序列处理命令,它们如果同时出现,那么也是按照在命令行中出现的先后顺序来依次执行。好像有点复杂,不过话说回来,在绝大多数场合下,没有必要组合使用这些命令。

[]当我们要使用select命令或者delete命令来操作帧序列的时候,遇到帧比较多的情况,挨个数帧编号也是挺麻烦的一件事情,因此pngmate特别提供了在图片上加注数字编号的功能,你可以用这个功能生成一张参考图片来方便工作:

pngmate ken.gif ken4.png -numbered -align 6

ken4.png
540) this.width = 540'>


PngMate的命令差不多都给大家介绍完了,下面我们来实战一个稍微复杂点的例子,从一张包含了所有帧的png图片生成小男孩向各个方向走的连续动画:

pngmate boyall.png -split 3x4 -select 0,1,0,2,0,1,0,2,6,7,6,8,6,7,6,8,3,4,3,5,3,4,3,5,9,10,9,11,9,10,9,11 boyall.gif -delay 150 -crop greedy
[]
boyall.png
540) this.width = 540'>
boyall.gif
540) this.width = 540'>


这命令行看上去有些复杂,不过其实就是那个select命令稍微长了一点,它依次指定了所有动画帧,其它的命令都是老朋友了,只不过这次组合起来一起用而已。

如果我有大量的图像文件想使用PngMate批量处理怎么办呢?虽然PngMate本身不支持批量处理文件,但你可以使用批处理文件(.bat文件)或者dos命令"for"来轻松的实现批处理功能。对于很多简单的处理,for命令就能搞定。严格说来,这已经不是本教程讨论的范畴,不过大家可能对for命令不太熟悉,我可以抛砖引玉介绍一二。

for命令的基本格式是for %变量 in (范围) do ...
do后面可以使用任何命令行命令,且中间可以使用前面的变量,比如在下面的例子中,我们将为当前目录下每张jpg图片生成一张64x64,60色的png预览图,文件名为原来的文件名去掉.jpg扩展名后再加上.png扩展名,那么:

for %I in (*.jpg) do @pngmate %I %~nI.png -resize 64x64 -colors 60


假设我有个S60的游戏,想往S40平台移植,要把所有图片整体按比例缩小到原来的72.7%(128/176),那么用for命令可以这么做:

[]md s40
for %I in (*.png) do @pngmate %I s40\%I -resize 72.7% -colors 16


[]当然这只是举个例子,如果你也这么干的话,你的游戏的S40版本估计十有八九是个垃圾了,因为pngmate缩小后的图片比起专门绘制的像素图,那质量当然是差远了。真正负责任的开发者还是应该专门为40版本绘制相应大小的像素图,千万不要跟笔者一样偷懒哦!

下载PngMate
[]

==
http:///tech/article849.html
</td></tr></table></td> </tr> <tr> <td background="/pic/split.gif" height=1></td> </tr> <tr> <td class="tdMargin1">
↑返回目录
前一篇: J2ME 走向成熟
后一篇: 使用JavaMagic进行游戏修改