Flash资源共享库打包工具Swift 1.0发布
最新更新:
2011-06-02 Swift 1.0.3发布。增加allowDomain属性设置的支持,解决跨域加载的问题。具体用法可参考下面的xml库文件示例。
2011-01-31 Swift 1.0.2发布。增加对输出SWC的支持。只要把输出文件参数后缀改为swc,即可编译为swc文件。增加两个编译font的参数char和charRange,可与unicode搭配使用。
Swfit是一个用Java开发的免费工具,它可以帮助你把图片、字体、声音、二进制数据等资源打包成一个swf文件(或swc文件),你可以在运行时动态加载并访问这些资源,实现运行时共享库,减少主应用程序体积和加速下载。
Swift有两种使用方式,一是xml2lib,顾名思义,它可以根据指定的xml文件内容编译成swf/swc库文件。二是dir2lib,它则可以把指定文件夹中的所有有效资源编译成swf库文件。
xml2lib 使用方法:
java -jar Swift.jar xml2lib lib.xml lib.swf
java -jar Swift.jar xml2lib lib.xml lib.swc
xml资源库文件示例:
<?xml version="1.0" encoding="utf-8"?>
<lib allowDomain="riaidea.com">
<bitmapdata file="image/img1.png" class="PNGBitmapData"/>
<bitmapdata file="image/img2.jpg" class="JPGBitmapData"/>
<bitmap file="image/img3.jpg" quality="80" class="JPGBitmap"/>
<bitmap file="image/img4.png" compression="true" quality="80" class="PNGBitmap"/>
<sprite file="image/img5.png" class="PNGSprite"/>
<sprite file="image/img6.jpg" class="JPGSprite"/>
<flexmovieclip file="image/img7.jpg" class="FlexMC"/>
<flexcontainer file="image/img8.jpg" class="FlexContainer"/>
<font file="Arial.ttf" unicode="u+0020-007e,u+00a0-036f" class="ArialFont" />
<font file="msyh.ttf" char="微软雅黑" charRange="a-z,A-Z" unicode="u+5fae,u+8f6f,u+96c5,u+9ed1,u+4e00-u+4eff" class="MsyhFont" />
<sound file="sound/test.mp3" class="TestSound"/>
<bytearray file="data/test.xml" class="XMLData"/>
</lib>
支持资源类型有:
* bitmapdata – 把指定图片文件编译成flash.display.BitmapData类,支持参数有compression,quality。
* bitmap – 把指定图片文件编译成flash.display.Bitmap类,支持参数有compression,quality。
* sprite – 把指定图片文件编译成flash.display.Sprite类,支持参数有compression,quality。
* flexmovieclip – 把指定图片文件编译成mx.flash.UIMovieClip类,支持参数有compression,quality。
* flexcontainer – 把指定图片文件编译成mx.flash.ContainerMovieClip类,支持参数有compression,quality。
* font – 把指定的字体文件编译成flash.text.Font类,支持参数有unicode。
* sound – 把指定声音文件编译成flash.media.Sound类。
* bytearray – 把指定的任何文件编译成flash.utils.ByteArray类。
注意事项:
* 所有资源都有file和class两个参数。file指定资源文件路径,当使用相对路径的时候,要注意这个路径是相对于执行 Swift.jar命令的路径,而不是相对于xml文件的路径。class参数指定资源编译成swf后的as3类定义名,从而能够通过 ApplicationDomain.getDefinition()来获取资源定义。
* 在图片类型资源中,如果是png格式,当参数compression为true时,图片将被编码成带alpha通道DefineBitsJPEG3,默认压缩比率即quality为80,相比原始图片可以得到更高的压缩比率。这也是Flash CS5中的处理方式。
* 在编译font字体资源时,如果不指定unicode参数,Swift将把字体中的所有有效字型都编译到swf中。一般的字体比较小的如英文字体可以完全编译,而像中文字体这种大型字体建议根据需要指定嵌入字型的unicode范围,如\u4e00-\u9fa5等。
* 声音sound资源目前只支持11hz倍率的音频文件,如何11hz,22hz,44hz等。
* allowDomain参数可指定访问域,与Security.allowDomain()方法作用一致。
dir2lib 使用方法:
java -jar Swift.jar dir2lib d:/myLibDir/ d:/myLibDir/lib.swf
java -jar Swift.jar dir2lib d:/myLibDir/ d:/myLibDir/lib.swc
下载地址:http://swift-tool.googlecode.com/files/Swift-1.0.3.zip
详细介绍:http://code.google.com/p/swift-tool/
欢迎任何Bug和建议,谢谢。
一月 20th, 2011 at 12:57
做的不错.不过我都是用.swc来处理这些素材的.
一月 20th, 2011 at 14:32
swc是预编译的,需要编译到项目中才能使用的。swift下个版本也会支持编译为swc的。
一月 30th, 2011 at 17:00
很好用的tool,谢谢。希望增加支持swc。有一个问题是这种方式处理8bit,8000hz的mp3时候似乎并没有把声音文件include到swf中,我试验了几个上边这种格式的声音文件都失败了,但是其他assets被正确include到swf中了,没有报错。
我的机器是
windows xp
jdk 1.6.0_21
和
windows vista
jdk 1.5.0_22
一月 30th, 2011 at 17:16
Swift 1.0.2已经支持编译为swc文件了,你可以去试试。另外目前只支持11hz倍数的音频文件,如11hz,22hz,33hz,44hz等。你的8khz的mp3是不被支持的,因此无法打包。
四月 19th, 2011 at 16:22
不知道加载进来后读取的效率怎么样呢?
四月 25th, 2011 at 23:32
这个加载进来的都已经是序列化好的as3类,应该不存在效率的问题。
四月 29th, 2011 at 10:51
打包png为bitmapdata,测试后发现,第一次访问bitmapdata像素数据的时候,flash player才真正解析png数据,以后的实例创建和数据访问都不会二次解析。所以,第一次访问数据的时候是性能消耗所在。
五月 4th, 2011 at 22:48
用了一下, 果然强大
有个问题想要请教一下,你是怎样把png导入到swf内,并且实现了压缩和质量, 据我了解,swf里面是把png当jpeg储存的,你又是怎样知道里面的格式的,一直没有查到swf里面存储png的压缩算法
五月 5th, 2011 at 10:32
你说的“第一次访问数据”是指第一次实例化这个png的bitmapdata的时候吗?不太清楚你是如何测试的,可以的话请发一个你的测试用例给我看看,谢谢。
五月 5th, 2011 at 10:40
你好,在swf里图片数据会被序列化成一些特定的数据结构,如DefineBitsJPEG2, DefineBitsLossless等,而不同的结构有不同的压缩比,alpha通道的差异。
六月 8th, 2011 at 16:26
Hi flashlizi,真是谢谢你开发了这个好用的tool。我自己已经用了很久,现在也打算用在公司的项目中。
但是遇到了问题,在ant中使用这个tool的时候,task会终止build并显示build success,现在还没有解决的办法。请问有什么好的建议吗?or 有没有考虑开发一个ant task呢?
再次感谢
六月 9th, 2011 at 12:10
Hi andyshang, 很高兴你喜欢这个工具。我刚测试了下ant调用swift.jar,应该是ok的。
比如下面的ant:
<project name=”Swift” default=”pack” basedir=”.”>
<target name=”pack”>
<java jar=”Swift.jar” fork=”true” maxmemory=”256m”>
<arg value=”xml2lib” />
<arg value=”test.xml” />
<arg value=”test_ant.swf” />
</java>
</target>
</project>
六月 10th, 2011 at 18:41
o, 我写了一个测试用的,有一个target depends到package的target,也没有问题了。很奇怪为什么之前的版本出现了问题。
不过用了很土的办法,也算解决了,把一个target里边多写了一个java task :/
真是非常棒的工具,那个xml文件顺便也可以做flex程序的资源配置文件,真方便
八月 5th, 2011 at 17:04
如果要用来打包as文件,就不行了?呵呵!
八月 9th, 2011 at 15:38
这个工具是用来打包资源的,不是来编译as的。
八月 22nd, 2011 at 15:28
非常强大,能否给dir2lib支持一个quality参数呢
八月 23rd, 2011 at 17:55
恩,这个可以考虑。
九月 22nd, 2011 at 10:29
楼主强大.
请教用swift-tool如果想把多张图片以序列帧的方式打包在一个MovieClip要怎么做呢
九月 22nd, 2011 at 22:38
抱歉,暂时不支持这种打包方式。
十月 14th, 2011 at 21:10
对于大图片,比如16M的,打包的时候会有内存不足的问题,希望能够解决。错误如下:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at com.riaidea.swift.transcoder.ImageEncoder.decodeImage(ImageEncoder.java:967)
at com.riaidea.swift.transcoder.ImageEncoder.decodePNG(ImageEncoder.java:851)
at com.riaidea.swift.transcoder.ImageEncoder.setImage(ImageEncoder.java:171)
at com.riaidea.swift.transcoder.ImageEncoder.(ImageEncoder.java:124)
at com.riaidea.swift.swf.SWFFactory.writeImageTag(SWFFactory.java:155)
at com.riaidea.swift.swf.SWFFactory.writeTags(SWFFactory.java:96)
at Swift.createSWF(Swift.java:83)
at Swift.convertXML2Lib(Swift.java:55)
at Swift.main(Swift.java:33)
十月 17th, 2011 at 14:57
这个问题是java vm设置的问题,添加类似的编译参数:-Xms64m -Xmx256m。
十一月 24th, 2011 at 08:08
不支持gif,很可惜