我正在尝试将Java2D中矢量图像drawin的输出保存到SWF文件中。有很多用于保存java2D输出的库,如SVG(BATIK)和PDF(itext),但我找不到一个用于SWF。有什么想法吗?
答案 0 :(得分:8)
我刚刚使用SpriteGraphics2D中的Adobe's Flex 3对象开始工作。仅供参考...... Flex 3现在是开源的。
(来自SpriteGraphics2D javadoc) SpriteGraphics2D是Java2D的Graphics2D API的SWF特定实现。对此类的调用将转换为TagList,可用于构造SWF Sprite。
我通过查看这两个类CubicCurveTest.java和SpriteTranscoder.java来解决这个问题。
运行此示例所需的两个jar是swfutils.jar和batik-awt-util.jar,它们可以是downloaded here。
这是我的示例代码......
// Create the SpriteGraphics2D object
SpriteGraphics2D g = new SpriteGraphics2D(100, 100);
// Draw on to the graphics object
Font font = new Font("Serif", Font.PLAIN, 16);
g.setFont(font);
g.drawString("Test swf", 30, 30);
g.draw(new Line2D.Double(5, 5, 50, 60));
g.draw(new Line2D.Double(50, 60, 150, 40));
g.draw(new Line2D.Double(150, 40, 160, 10));
// Create a new empty movie
Movie m = new Movie();
m.version = 7;
m.bgcolor = new SetBackgroundColor(SwfUtils.colorToInt(255, 255, 255));
m.framerate = 12;
m.frames = new ArrayList(1);
m.frames.add(new Frame());
m.size = new Rect(11000, 8000);
// Get the DefineSprite from the graphics object
DefineSprite tag = g.defineSprite("swf-test");
// Place the DefineSprite on the first frame
Frame frame1 = (Frame) m.frames.get(0);
Matrix mt = new Matrix(0, 0);
frame1.controlTags.add(new PlaceObject(mt, tag, 1, null));
TagEncoder tagEncoder = new TagEncoder();
MovieEncoder movieEncoder = new MovieEncoder(tagEncoder);
movieEncoder.export(m);
//Write to file
FileOutputStream fos = new FileOutputStream(new File("/test.swf"));
tagEncoder.writeTo(fos);
答案 1 :(得分:2)
嗯,我知道有些库输出Flash内容,比如或Ming,甚至是Haxe,这种语言可以“翻译”成JavaScript,Flash或PHP代码。 ..但我不知道Java库。
搜索了一下(我很好奇),我发现了一个商业Java Graph Library,可能是封闭源代码,Java中的Flash播放器,操作ActionScript源代码的库或bytecode ......啊,后者指向JavaSWF2,它应该能够生成SWF。我还找到了一个DrawSWF,它使用... JavaSWF2库作为后端!
PS。:还找到Transform SWF。看起来很有希望。
答案 2 :(得分:1)
Flash通常使用SVG作为其本机格式。您可以导出到SVG,然后编写一个简单的Flash程序来嵌入和显示图像。但为什么要使用Flash呢?现在大多数浏览器都能够显示SVG。
编辑:我不知道为什么我因为一个明确正确的答案而被投票。我可以理解没有因为没有得到最好的答案而被投票(我完全承认这个解决方案并不理想),但我真的认为它不值得投票。您可以参考this page中间关于在Flex程序中嵌入SVG的部分。对于那些不熟悉的人,Flex是一个adobe工具包/库,可生成在普通Flash播放器中运行的SWF程序。许多(全部?)普通Flash库都可用。它使用ActionScript。对于你的怀疑者,这里有一个片段,显示你是如何做到的,从我写的Flex程序中复制。它应该放在MXML文件中。
<mx:Script><![CDATA[
[Embed(source="../images/down.svg")]
[Bindable]
protected var drillDownImage:Class;
]]></mx:Script>
<mx:HBox width="50%" horizontalAlign="right">
<mx:Image id="drillDownButton" source="{drillDownImage}" height="20" width="20" click="drillDown();" />
</mx:HBox>
现在你需要做的就是将它包装在一个合适的MXML文件中,也可以为HBox和Image标签导入一些控件包,你就可以了。我提供的链接中的示例应该足以让您弄明白。
答案 3 :(得分:1)
这可能不是你想要的,但我会把它作为一个建议 -
您是否考虑过使用Flash绘图API制作java输出动作脚本并使用free flex as3编译器将其编译为.SWF文件?如果您不使用flex库,则不包含任何库。您的java代码只会输出动作脚本代码模板所包围的绘图线。
这使得Test.swf绘制一个正方形并为我编译为610字节。
如果您需要动态转换,那么这将是缓慢的,但对于预转换的图纸,这将很简单。
package{
import flash.display.Sprite;
public class Test extends Sprite{
public function Test (){
// Start of lines generated by your java
graphics.lineStyle(1, 0, 1);
graphics.lineTo(100, 0);
graphics.lineTo(100, 100);
graphics.lineTo(0, 100);
graphics.lineTo(0, 0);
// End of lines generated by your java
}
}
}
答案 4 :(得分:0)
据我所知,flash根本不使用SVG。我完全不相信提到这个答案是正确的。 (但我不能只是添加这个作为评论,因为我没有足够的分数......)
答案 5 :(得分:0)
结帐Transform SWF。 API需要一些时间来习惯,但它带有一些非常有用的示例来帮助您入门。我自己使用它并且效果很好。
我的建议是完全跳过SVG,作为从Java2D到SWF的一种方式。使用我试图将SVG导入Flash的解决方案,Batik生成的SVG表现非常糟糕。