Вопрос по php, inkscape, svg – Как преобразовать строку SVG в JPG с Inkscape

7

После двух дней попыток растеризации JPEG-строк из SVG-строк с помощью ImageMagick я, наконец, сдался.

Хотя мне удалось добиться, чтобы фактическое преобразование работало нормально, похоже, Imagemagick не может правильно преобразовать функции преобразования / поворота при рендеринге изображения, оставляя вывод, отличный от исходного SVG.

После дальнейших исследований выясняется, что это известная проблема и что «Inkscape» является лучшим методом для преобразования SVG в jpeg / png в PHP.

Проблема в том, что мои SVG-данные отправляются в мой PHP-скрипт через JSON. Как получить блоб или строку в командную строку Inkscape для ее преобразования?

Большое спасибо за любые предложения.

Ваш Ответ

2   ответа
2

и вы отправляете ее из браузера на сервер через AJAX, вам нужно записать ее во временный файл, чтобы на нее можно было ссылаться из командной строки Inkscape. Вы не можете рендерить в JPEG с помощью командной строки Inkscape, но вы можете легко рендерить в PNG, и если вам действительно нужен другой формат, конечно, вы можете впоследствии конвертировать с помощью ImageMagick.

Вам понадобится что-то вроде:

/path/to/inkscape \
    --without-gui \
    --export-png=/path/to/output.png \
    /tmp/file/input.svg

Если вы принимаете полный / частичный SVG-ввод от пользователя, имейте в виду, что вам необходимо помнить о большом количестве проблем безопасности. Рад расширить на это, если требуется.

Я могу только представить, что ты против этого! ой! ... Еще раз спасибо :-) gordyr
Конечно, я не могу поверить, что не думал об этом. Все входные данные SVG - это сгенерированная клиентская сторона в приложении (перетаскивание и преобразование объектов / изображений и т. Д.), Поэтому пользователь фактически никогда не сможет самостоятельно вводить код SVG. Тем не менее, это все еще оставляет несколько дыр в безопасности, о которых я хорошо знаю. Спасибо за быстрый и точный ответ! gordyr
Нет проблем. Пока вы знаете о дырах в безопасности - я работаю над приложением, в которое пользователи загружают документ SVG, и я нахожу интересные & quot; функции & quot; часто!
3

используя stdin, но код менее переносим.

// Open Inkscape process
$process = proc_open(
    '/path/to/inkscape -z -f /dev/fd/0 -e /path/to/output' 
    array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')), 
    $pipes
);

// Write svg to stdin
fwrite($pipes[0], $svg);

// Close process
foreach ($pipes as $pipe) fclose($pipe);
proc_close($process);
то, что & APOS; s/dev/fd/0?

Похожие вопросы