将Java2D保存到SWF(闪存)

我正在尝试将Java2D中矢量图像drawin的输出保存到SWF文件中。 有很多用于保存java2D输出的库,如SVG(BATIK)和PDF(itext),但我找不到一个用于SWF的库。 有任何想法吗?

我刚刚得到一个使用Adobe Flex 3中的SpriteGraphics2D对象的示例。 仅供参考…… Flex 3现在是开源的。

(来自SpriteGraphics2D javadoc) SpriteGraphics2D是Java2D的Graphics2D API的SWF特定实现。 对此类的调用将转换为TagList,可用于构造SWF Sprite。

我通过查看CubicCurveTest.java和SpriteTranscoder.java这两个类来解决这个问题 。

运行此示例所需的两个jar是swfutils.jar和batik-awt-util.jar,可以在这里下载 。

这是我的示例代码…

// 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); 

嗯,我知道一些库输出Flash内容,比如 或明 ,甚至haXe ,一种可以“翻译”成JavaScript,Flash或PHP代码的语言……但我知道没有Java库。

搜索了一下(我很好奇),我发现了一个商业Java Graph Library ,可能是封闭源代码,Java中的Flash播放器,用于操作ActionScript源代码或字节码的库……啊,后者指向JavaSWF2应该是能够生成SWF。 我还发现了一个DrawSWF ,它使用… JavaSWF2库作为后端!

PS。:还找到了变换SWF 。 看起来很有希

这可能不是你想要的,但我会把它作为一个建议 –

您是否考虑过使用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 } } } 

Flash通常使用SVG作为其本机格式。 您可以导出到SVG,然后编写一个简单的Flash程序来嵌入和显示图像。 但为什么要使用Flash呢? 现在大多数浏览器都能够显示SVG。

编辑 :我不知道为什么我被投票给了一个明确正确的答案。 我可以理解没有因为没有得到最好的答案而被投票(我完全承认这个解决方案并不理想),但我真的认为它不值得投票。 您可以参考本页中间有关在Flex程序中嵌入SVG的部分。 对于那些不熟悉的人,Flex是一个adobe工具包/库,可以生成在普通Flash播放器中运行的SWF程序。 许多(全部?)普通Flash库都可用。 它使用ActionScript。 对于你的怀疑者,这里是一个片段,显示你是如何做到的,从我写的Flex程序中复制。 它应该进入MXML文件。

     

现在您需要做的就是将其包装在适当的MXML文件中,也可以为HBox和Image标签导入一些控件包,您就可以了。 我提供的链接中的示例应该足以让您弄明白。

据我所知,闪存根本不使用SVG。 我完全不相信提到这个答案是正确的。 (但我不能只是添加这个作为评论,因为我没有足够的分数…)

查看转换SWF 。 API需要一些时间来习惯,但它带有一些非常有用的示例来帮助您入门。 我自己用过,效果很好。

我的建议是完全跳过SVG作为从Java2D到SWF的一种方式。 Batik生成的SVG与我试图将SVG导入Flash的解决方案表现得非常糟糕。