Сохранить Java2D в SWF (flash) - PullRequest
       19

Сохранить Java2D в SWF (flash)

7 голосов
/ 06 ноября 2008

Я пытаюсь сохранить вывод векторного изображения в Java2D в файл SWF. Есть отличные библиотеки для сохранения выходных данных java2D как SVG (BATIK) и PDF (itext), но я не могу найти одну для SWF. Есть идеи?

Ответы [ 6 ]

8 голосов
/ 06 ноября 2008

Я только что получил пример работы с SpriteGraphics2D объектом из Adobe's Flex 3 . К вашему сведению ... Flex 3 теперь с открытым исходным кодом.

(из javadoc SpriteGraphics2D) SpriteGraphics2D - это специфическая для SWF реализация Java2D API Graphics2D. Вызовы этого класса преобразуются в TagList, который можно использовать для создания SWF-спрайта.

Я понял это, посмотрев на эти два класса 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);
2 голосов
/ 06 ноября 2008

Мм, я знаю некоторые библиотеки, выводящие Flash-контент, например или Ming , или даже Haxe , язык, который может быть "переведен" в JavaScript, Flash или PHP-код ... Но я не знаю библиотеки Java.

Немного поиска (мне любопытно), я нашел коммерческую библиотеку графов Java , возможно, с закрытым исходным кодом, Flash-проигрыватель на Java, библиотеки для манипулирования исходным кодом ActionScript или байт-код ... Ах, последний указывает на JavaSWF2 , который должен генерировать SWF. Я также нашел DrawSWF , который использует ... библиотеку JavaSWF2 в качестве внутреннего!

PS .: также найдено Преобразование SWF . Выглядит многообещающе.

1 голос
/ 06 ноября 2008

Это, вероятно, не то, что вы ищете, но я добавлю это как предложение -

Рассматривали ли вы создание своего выходного сценария действий Java для рисования векторов с помощью API-интерфейса рисования флэш-памяти и компиляции его в файл .SWF с помощью бесплатного компилятора flex as3? Если вы не используете библиотеку 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
    }
  }
}
1 голос
/ 06 ноября 2008

Flash обычно использует SVG в качестве собственного формата. Вы можете экспортировать в SVG, а затем написать простую программу Flash для вставки и отображения изображения. Но зачем вообще использовать Flash? В настоящее время большинство браузеров способны отображать SVG.

Редактировать : Я не знаю, почему я был отвергнут за явно правильный ответ. Я могу понять, что за то, что у меня не было лучшего ответа, не голосуют (я полностью признаю, что это решение не идеально), но я действительно не думаю, что оно заслуживает отрицательного ответа. В середине этой страницы вы можете обратиться к разделу о встраивании SVG в программы Flex. Для тех из вас, кто не знаком, Flex представляет собой Adobe Toolkit / Library, который генерирует SWF-программы, которые запускаются в обычном проигрывателе Flash. Многие (все?) Нормальные библиотеки 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, и все готово. Пример в ссылке, которую я привел, должен быть достаточным для вас, чтобы понять это.

0 голосов
/ 13 января 2009

Оформить Преобразовать SWF . API требует некоторого времени, чтобы привыкнуть к нему, но он содержит несколько действительно полезных примеров, с которых можно начать. Я сам использовал его, и он работает очень хорошо.

Мой совет - вообще пропустить SVG, чтобы перейти от Java2D к SWF. SVG, который производит Batik, очень плохо работает с решениями, которые я пытался импортировать в SVG.

0 голосов
/ 06 ноября 2008

Насколько я знаю, flash вообще не использует SVG. Я нисколько не убежден, что ответ, упоминающий, что это правильно. (Но я не могу просто добавить это как комментарий, так как хотел, потому что у меня недостаточно очков ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...