我有一个由wordpress插件生成的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();
有人知道为什么会这样吗,我该如何解决呢? 必须将图像正确地定位在“画布”上,因为它是T恤的打印模板,并且需要准确。
答案 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。