2008-11-05 18 views
7

Estoy intentando guardar la salida de un dibujo de imagen vectorial en Java2D en un archivo SWF. Existen excelentes bibliotecas para guardar resultados java2D como SVG (BATIK) y PDF (itext) pero no puedo encontrar uno para SWF. ¿Algunas ideas?Guardar Java2D en SWF (flash)

Respuesta

8

acabo de recibir un ejemplo para trabajar con el objeto de SpriteGraphics2DAdobe's Flex 3. FYI ... Flex 3 ahora es de código abierto.

(desde SpriteGraphics2D javadoc)SpriteGraphics2D es una implementación específica SWF de API de Graphics2D Java2D. Las llamadas a esta clase se convierten en una Lista de Etiquetas que se puede usar para construir un SWF Sprite.

Me di cuenta de esto mirando estas dos clases CubicCurveTest.java y SpriteTranscoder.java.

Las únicas dos jarras necesarias para ejecutar este ejemplo son swfutils.jar y batik-awt-util.jar que pueden ser downloaded here.

Aquí está mi código de ejemplo ...

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

¡Esto se ve muy bien! Sin embargo, necesitaría verificar la licencia, parece haber una obligación de publicar la fuente, pero eso * puede * ser solo para los cambios que realice en la biblioteca. No lo he leído en detalle. – jcoder

1

Flash generalmente usa SVG como su formato nativo. Puede exportar a SVG y luego escribir un programa de Flash trivial para incrustar y mostrar la imagen. ¿Pero por qué usar Flash en absoluto? La mayoría de los navegadores son capaces de mostrar SVG hoy en día.

Editar: No sé por qué fui votado negativamente por una respuesta claramente correcta. Puedo entender que no me voten por no tener la mejor respuesta (reconozco plenamente que esta solución no es ideal), pero realmente no creo que merezca un voto negativo. Puede consultar la sección en el medio de this page sobre la incorporación de SVG en programas Flex. Para aquellos de ustedes que no están familiarizados, Flex es un kit de herramientas de adobe/biblioteca que genera programas SWF que se ejecutan en el reproductor Flash normal. Muchas (¿todas?) De las bibliotecas Flash normales están disponibles. Utiliza ActionScript. Para quienes dudan, aquí hay un fragmento que muestra exactamente cómo lo hace, copiado de un programa Flex que escribí. Debería ir dentro de un archivo 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> 

Ahora todo lo que necesita hacer es envolver que en un archivo MXML apropiada, tal importar algunos controles de paquetes para las etiquetas HBox y la imagen, y ya está bueno para ir. El ejemplo en el enlace que proporcioné debería ser suficiente para que usted lo resuelva.

+0

Me han quitado uno de sus votos negativos. Mi desarrollador de flash (que solo hace flash, no flexiona) estaba convencido de que no había forma de mostrar directamente svg en flash. Parece que Flex puede convertir (creo que a través de Batik en realidad) svg en flash, pero no es el formato SWF nativo. – wburke

2

Mm, sé que algunas bibliotecas de la extracción de contenido de Flash, como o Ming, o incluso haXe, un lenguaje que puede ser "traducido" en JavaScript, Flash o código PHP ... Pero sé que ninguna biblioteca de Java.

Buscando un poco (tengo curiosidad), me encontré con un anuncio de Java Graph Library, probablemente, de código cerrado, un reproductor de Flash en Java, las bibliotecas para manipular el código fuente de ActionScript o bytecode ... Ah, los últimos puntos a JavaSWF2 que se supone para poder generar SWF. También encontré un DrawSWF que usa ... la biblioteca JavaSWF2 como back-end.

PD .: También se encontró Transform SWF. Parece prometedor.

0

Hasta donde yo sé, flash no utiliza SVG en absoluto. No estoy del todo convencido de que la respuesta que menciona eso sea correcta. (Pero no puedo agregar esto como un comentario ya que no tengo suficientes puntos ...)

1

Esto probablemente no es lo que estás buscando, pero lo lanzaré como una sugerencia -

¿Ha considerado hacer su java output actionscript para dibujar los vectores usando la API de dibujo de flash y compilarlo en un archivo .SWF usando el compilador de flex as3 libre? Si no usa la biblioteca de flex, no incluye nada de eso. Su código java simplemente generará las líneas de dibujo rodeadas por una plantilla para el código de ActionScript.

Esto hace Test.swf que dibuja un cuadrado y compila hasta 610 bytes para mí.

Si necesita convertir sobre la marcha, esto sería lento, pero para los dibujos preconvertidos sería simple.

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 
    } 
    } 
} 
0

Salida Transform SWF. La API lleva un tiempo para acostumbrarse, pero viene con algunos ejemplos realmente útiles para comenzar. Lo he usado yo mismo y funciona muy bien.

Mi consejo sería omitir SVG por completo como una forma de pasar de Java2D a SWF. El SVG que produce Batik se comporta muy mal con las soluciones que traté de importar SVG en Flash.

Cuestiones relacionadas