【发布时间】:2010-09-20 23:41:53
【问题描述】:
我正在尝试将 Java2D 中的矢量图像绘制的输出保存到 SWF 文件中。有很棒的库可以将 java2D 输出保存为 SVG (BATIK) 和 PDF(itext) 之类的东西,但我找不到 SWF 的库。有什么想法吗?
【问题讨论】:
我正在尝试将 Java2D 中的矢量图像绘制的输出保存到 SWF 文件中。有很棒的库可以将 java2D 输出保存为 SVG (BATIK) 和 PDF(itext) 之类的东西,但我找不到 SWF 的库。有什么想法吗?
【问题讨论】:
我刚刚得到了一个使用来自Adobe's Flex 3 的SpriteGraphics2D 对象的示例。仅供参考...Flex 3 现在是开源的。
(来自 SpriteGraphics2D javadoc) SpriteGraphics2D 是 Java2D 的 Graphics2D API 的 SWF 特定实现。对此类的调用将转换为可用于构造 SWF Sprite 的 TagList。
我通过查看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);
【讨论】:
嗯,我知道一些输出 Flash 内容的库,比如 或 Ming,甚至是 Haxe,一种可以“翻译”成 JavaScript、Flash 或 PHP 代码的语言......但我不知道Java 库。
搜索了一下(我很好奇),我找到了一个商业的Java Graph Library,可能是封闭源代码,Java 中的Flash 播放器,用于操作ActionScript 源代码的库或bytecode...啊,后者指向@ 987654326@应该能够生成SWF。我还发现了一个DrawSWF,它使用... JavaSWF2 库作为后端!
PS.:还发现了Transform SWF。看起来很有希望。
【讨论】:
这可能不是您想要的,但我会将其作为建议提供 -
您是否考虑过让您的 java 输出动作脚本使用 flash 绘图 API 绘制矢量并使用免费的 flex as3 编译器将其编译为 .SWF 文件?如果您不使用 flex 库,则它不包含任何内容。您的 java 代码只会输出被 actionscript 代码模板包围的绘图线。
这使得 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。
编辑:我不知道为什么我因为一个明确正确的答案而被否决。我可以理解没有因为没有最佳答案而被投赞成票(我完全承认这个解决方案并不理想),但我真的认为它不值得投反对票。您可以参考this page 中间的部分关于在 Flex 程序中嵌入 SVG。对于那些不熟悉的人,Flex 是一个 adobe 工具包/库,可以生成在普通 Flash 播放器中运行的 SWF 程序。许多(全部?)正常的 Flash 库可供它使用。它使用动作脚本。对于怀疑者,这里有一个 sn-p 显示了你是如何做到的,它是从我编写的 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 标签导入一些控件包,你就可以开始了。我提供的链接中的示例应该足以让您弄清楚。
【讨论】:
据我所知,flash 根本不使用 SVG。我根本不相信提到这一点的答案是正确的。 (但我不能随心所欲地将其添加为评论,因为我没有足够的积分......)
【讨论】:
查看Transform SWF。 API 需要一些时间来适应,但它附带了一些非常有用的示例来帮助您入门。我自己用过,效果很好。
我的建议是完全跳过 SVG,作为从 Java2D 到 SWF 的一种方式。 Batik 生成的 SVG 与我尝试将 SVG 导入 Flash 的解决方案表现得非常糟糕。
【讨论】: