Создать PNG из SVG со встроенным изображением

Я боролся в течение нескольких дней с этим:
У меня есть изображение SVG, которое показывает цвета, выбранные пользователем сайта, наложенные на изображение продукта. Другими словами, svg содержит базовое изображение (либо в виде ссылки на локальный файл (тот же каталог), либо в виде встроенного URI в кодировке base64 (data: image / png; base64, …).

Я хочу сохранить это изображение в качестве подтверждения того, что было выбрано, которое впоследствии может быть отправлено клиенту по электронной почте. Так как поддержка электронной почты для svg, по меньшей мере, неоднозначна, я хочу преобразовать изображение из svg в png. Однако ни iMagick, ни MagickWand не делают это успешно. Они оба просто отображают оверлеи и игнорируют встроенный или связанный png.

Я пробовал все варианты, которые я могу придумать, включая чтение изображения из URL-адреса или чтение imageblob из результата file_get_contents. Но результат всегда один и тот же: нет фонового изображения.

Я также попытался удалить все <! [CDATA]>, <стиль>, <г> и другую несущественную информацию из svg, чтобы убедиться, что это не проблема с содержимым svg. Но, опять же, результат тот же (конечно, без CSS-стайлинга!)

Я трачу свое время? Может ли iMagick не конвертировать встроенные / связанные изображения? Или я глупый и упускаю что-то очевидное?

Вот пример кода (который довольно стандартен):
Svgs сохраняются на сервере, когда клиент выбрал цветовую схему и выглядит следующим образом (здесь усечено):

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"width="400px" height="400px" viewBox="0 0 400 400" style="enable-background:new 0 0 400 400;" xml:space="preserve">
<style type="text/css">
<![CDATA[
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:rgb(17,178,0);mix-blend-mode: multiply;}
.st2{fill-rule:evenodd;clip-rule:evenodd;fill:rgb(112,23,145);mix-blend-mode: multiply;}
]]>
</style>
<image style="overflow:visible;" width="400" height="400" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAAgAElEQVR4nOy9a6xtWXYe9I0x51r7...
...U5ErkJggg==">
</image>
<path class="st2" d="M40.605,152.484c1.056,0.048,2.112,0...
...38.013,253.708z"/>
<path class="st1" d="M38.733,139.381c0.192...
114.615,234.27z"/>
</svg>

Они отлично отображаются при использовании в качестве URI для изображений SVG.

Я пытаюсь преобразовать их в PNG таким образом:

<?php
$im = new Imagick();
$im->setBackgroundColor(new ImagickPixel('transparent'));
$im->readImageBlob($svg); //readImage($url) gives same result
$im->setImageResolution(72,72);
$im->resampleImage  (72,72,imagick::FILTER_UNDEFINED,1);
$im->setImageFormat("png"); //png, png24, png32 all give same result
$im->writeImage("../svg/temp.png");
?>
<img src="temp.png">

То же самое (альтернативно) с MagickWand:

<?php
$mw = NewMagickWand();
$transparentColor = NewPixelWand();
PixelSetColor($transparentColor, 'transparent');
MagickSetBackgroundColor($mw, $transparentColor);
MagickReadImage($mw, $_SERVER['DOCUMENT_ROOT']."/svg/example.svg");
MagickSetImageBackgroundColor($mw, $transparentColor);
MagickSetImageFormat($mw, 'png32'); // png, png24 and png32 all same result
MagickWriteImage($mw, $_SERVER['DOCUMENT_ROOT']."/svg/temp2.png");

?>
<img src="temp2.png">

Кто-нибудь может предложить способ получения всего изображения, а не только двух путей в png?

Благодарен за любые предложения

Большое спасибо

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]