У меня есть изображение SVG, созданное плагином wordpress. Я хочу преобразовать его в PNG для дальнейших действий.
Плагин может сделать это успешно через JS. Результат - это изображение:

Когда я использую imagick для преобразования SVG в png, в результате я получаю следующее:

Код SVG выглядит так:
<svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" data-zoom = "11.81102361" height = "290" width = "210" data-main = "1">
<svg y = "62" x = "17" xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" xml:space = "preserve" preserveAspectRatio = "none" width = "178" height = "133"><g><image x = "0" y = "0" width = "178" preserveAspectRatio = "none" height = "133" xlink:href = "[BASE64 IMAGE CODE]"/></g></svg>
</svg>
Полная версия здесь: https://pastebin.com/vzn7BP2d
Я использую этот код для преобразования:
$svg = file_get_contents('front-test.svg');
$im = new Imagick();
$im->setBackgroundColor(new ImagickPixel('transparent'));
$im->setResolution(300, 300); // for 300 DPI example
$im->readImageBlob('<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>'.$svg);
$im->setImageFormat("png24");
//$im->resizeImage(250, 250, imagick::FILTER_LANCZOS, 1);
$im->writeImage('front-test.png');
$im->clear();
$im->destroy();
Кто-нибудь знает, почему это происходит и как я могу это решить? Необходимо, чтобы изображение было правильно расположено на «холсте», потому что это шаблон для печати на футболках и он должен быть точным.
Спасибо за ответ. Я добавил полную версию svg в свой пост. Я нахожусь на общем хостинге, который не поддерживает рекомендуемые дополнения
Вы уверены, что они не могут установить Inkscape? Это не делегат, который нужно устанавливать вместе с ImageMagick.
Я протестировал использование ImageMagick с каждым из MSVG, RSVG и Inkscape для преобразования в PNG. MSVG дал те же результаты, что и вы. RSVG дал пустое изображение. Инскейп работает нормально.
Если вы не можете использовать Inkscape, то, возможно, опубликуйте отчет об ошибке, связанный с MSVG, на форуме ошибок по адресу imagemagick.org/discourse-сервер.
Попробую спросить у своего хостера. Но я хотел бы предоставить эти плагины другим людям. Не все смогут установить дополнительное программное обеспечение. Я проверю форум и могу сообщить об ошибке. Спасибо, что изучили это.






Файл SVG, который у вас есть, на самом деле не является векторным изображением. Это просто PNG, завернутый в SVG. Это упрощает получение изображения: прочитайте URL-адрес данных, составляющих изображение, расшифруйте его и запишите результат в файл. ImageMagick не требуется, только gd.
$svg = simplexml_load_file('front-test.svg');
$data_url = $svg->svg->g->image['xlink:href'];
$encoded = $data_url.explode(',')[1];
$data = base64_decode($encoded);
$im = imagecreatefromstring($data);
imagepng($im, 'front-test.png');
Спасибо за внимание. Мой пример очень упрощен. SVG может быть очень сложным с различными типами узлов. Поскольку мне нужны изображения, расположенные на нижележащем холсте, ваш код просто извлечет изображение.
Спасибо fmw42 за предложения по поводу разных рендереров. После некоторого исследования этой проблемы я обнаружил, что даже imagemagick рекомендует использовать другой рендерер, и закрыл эту проблему с помощью won't fix:
We recommend the libRSVG delegate library or inkscape delegate program as the preferred SVG renderer. The internal renderer is less robust and likely will never support all of the SVG standard.
Источник: https://github.com/ImageMagick/ImageMagick/issues/335
Чтобы решить эту проблему, я попробовал разные онлайн-конвертеры, чтобы увидеть, есть ли у них эта проблема. Большинство из них дали мне просто пустой холст, у других был тот же результат, что и у моей второй картины в моем вопросе.
Я перестал искать конвертеры после того, как нашел https://convertio.co/de/ Они могут дать мне правильное выходное изображение. У них есть API, который можно использовать в течение 25 минут бесплатно в день: https://developers.convertio.co/.
Это было единственное решение для моего случая, так как я хотел, чтобы проект был гибким, поскольку некоторые пользователи не смогут установить inkscape на свой сервер.
Вы не предоставили связанное изображение для проверки. Но ваша проблема, вероятно, заключается в том, какой модуль визуализации SVG использует ImageMagick. ImageMagick может использовать свой собственный внутренний рендеринг MSVG/XML, который похож на то, что вы используете, и что не очень хорошо. Затем вы можете установить делегата RSVG, что лучше. Но лучшее решение — установить Inkscape, и ImageMagick будет использовать его автоматически. Это лучший выбор.