Как преобразовать строку SVG в jpg с помощью Inkscape

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

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

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

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

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

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

Вам нужно что-то вроде:

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

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

Вы можете передать строку SVG в inkscape с помощью 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);