Программно генерировать PNG из изображения Raphael.JS - PullRequest
5 голосов
/ 29 июля 2010

Я пишу приложение, которое позволяет пользователям создавать изображения с помощью Raphael.JS.Одна из второстепенных функций, которую я хочу, - это генерирование PNG холста Рафаэля.

Вот общий конвейер в моей голове:

  1. Пользовательские параметры ввода
  2. Мысгенерировать JS с вызовами Рафаэля
  3. Мы генерируем JS-оболочку, которая выполняет вышеуказанное и вызывает .innerHTML для содержащего div, давая нам SVG (который мы затем отправляем куда-то)
  4. Мы выполняем JS-оболочку
  5. SVG отправляется в ImageMagick и выдает PNG

Шаг 4 - это шаг, по которому мне нужно некоторое руководство.Пользователь может использовать IE;у нас нет гарантии, что JS когда-либо будет выполняться в браузере SVG.В любом случае, нам нужно, чтобы он работал на стороне сервера, чтобы он был надежным.Итак, вот три возможности, которые я до сих пор предлагал:

  • Установите Firefox на сервере и запустите результат (3) в Firefox.Эта опция - отстой, потому что установка FF означает установку множества X-материалов на наш сервер, запуск FF влечет за собой много накладных расходов, и я действительно не хочу ломать голову, отслеживая процесс и убивая его, как только он будет завершен.
  • Используйте Node.js + jsdom (http://github.com/tmpvar/jsdom). Недостатком здесь является то, что неясно, насколько поддерживается jsdom - предполагаемый сайт jsdom.org на самом деле не существует. Кроме того, я не могу найти какую-либо документацию.
  • Может, что-то сделать с Rhino? Насколько я могу судить, Rhino имеет еще более скудную поддержку DOM, чем Node.

Итак ... все три из этих опций вродеСосать. Я думаю. Я что-то не так? Есть другой способ?

Ответы [ 3 ]

3 голосов
/ 23 ноября 2010

Решено это с помощью wkhtmltoimage.Гадкое решение, но оно работает.

1 голос
/ 05 августа 2010

После того как ваш документ SVG сериализован на клиенте, все, что вам нужно, - это рендерер SVG и / или растеризатор, работающий на вашем сервере для создания PNG. Мне не ясно, что, по вашему мнению, будет делать JS-обертка или зачем она нужна. Поскольку отправляемый SVG-документ не будет содержать динамического содержимого, все, что вам нужно, это отправить сериализованный SVG-документ растеризатору на сервере, чтобы растеризовать его как PNG.

Рендерер / растеризатор SVG может быть просто CGI-скриптом, который вызывает ImageMagick, или может быть чем-то более сложным. Лично я бы порекомендовал настроить сервлет, работающий под управлением Apache Batik, который включает в себя SVG Rasterizer и может вызываться программно. Быстрый поиск в Google показывает, что это довольно распространенная задача для Batik: http://www.mail-archive.com/batik-users@xml.apache.org/msg06116.html

0 голосов
/ 29 июля 2010

Вы можете попробовать преобразовать VML в SVG на сервере , прежде чем запускать его через ImageMagick.Я знаю, что сам проект PHP, но преобразование выполняется с помощью XSL (файл находится в архиве загрузок), поэтому его следует переносить на любую серверную платформу.

...