将Java2D保存到SWF(闪存)

时间:2008-11-05 22:38:19

标签: java flash

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

6 个答案:

答案 0 :(得分:8)

我刚刚使用SpriteGraphics2D中的Adobe's Flex 3对象开始工作。仅供参考...... Flex 3现在是开源的。

  

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

我通过查看这两个类CubicCurveTest.javaSpriteTranscoder.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表现非常糟糕。