PHP: преобразование SVG в PNG приводит к неправильному изображению - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть изображение SVG, которое генерируется плагином WordPress.Я хочу преобразовать его в PNG для дальнейших действий.

Плагин может сделать это успешно через JS.В результате получается следующее изображение: enter image description here

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

Код 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();

Кто-нибудь знает, почему это происходит и как я могу решить это?Необходимо, чтобы изображение было правильно расположено на «холсте», поскольку оно является шаблоном для печати футболок и должно быть точным.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Спасибо fmw42 за то, что он дал советы о разных рендерерах.После некоторых исследований этой проблемы я обнаружил, что даже imagemagick рекомендует использовать другой рендер, и закрыл эту проблему с помощью won't fix:

Мы рекомендуем библиотеку делегатов libRSVG или программу делегирования inkscape в качестве предпочтительного средства визуализации SVG.,Внутренний рендерер менее надежен и, вероятно, никогда не будет поддерживать все стандарты SVG.

Источник: https://github.com/ImageMagick/ImageMagick/issues/335

Чтобы решить эту проблему, я пробовал разные онлайн-конвертеры, чтобы увидеть, еслиу них тоже есть эта проблема.Большинство из них дали мне только пустой холст, другие имели тот же результат, что и моя вторая картинка в моем вопросе.

Я прекратил поиск конвертеров после того, как обнаружил https://convertio.co/de/ Они могут дать мнеправильный вывод изображения.У них есть API, который можно использовать бесплатно в течение 25 минут преобразования ежедневно: https://developers.convertio.co/

Это был единственный подход для моего случая, поскольку я хотел, чтобы проект был гибким, поскольку некоторые пользователи могут этого не делатьиметь возможность установить inkscape на свой сервер.

0 голосов
/ 23 февраля 2019

Файл 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');
...