Проведя два дня, пытаясь растеризовать 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);