PHP:SVG到PNG的转换导致图像错误

时间:2019-02-22 16:12:22

标签: php image svg imagemagick png

我有一个由wordpress插件生成的SVG图像。 我想将其转换为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();

有人知道为什么会这样吗,我该如何解决呢? 必须将图像正确地定位在“画布”上,因为它是T恤的打印模板,并且需要准确。

2 个答案:

答案 0 :(得分:1)

您拥有的SVG文件实际上不是矢量图像。它只是包装在SVG中的PNG。这使得获取图像变得很简单:读取组成图像的数据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');

答案 1 :(得分:1)

感谢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。