请帮忙。我使用php Imagick库成功地将svg(包括<image/>
标签中的嵌入式png图像)转换为png图像直到最近。我想在ubuntu上进行了一些更新后,嵌入式png图像停止出现在svg转换后的图像中。
$svg = json_decode($_POST['svgdata']);
$svg = '<?xml version="1.1" encoding="UTF-8" standalone="no"?>'.$svg;
$im = new Imagick();
$success = $im->readImageBlob($svg);
$im->setImageFormat("png24");
$im->writeImage('png_img/var.png');
如果我回复$ svg,它会给我一个正确的图像。
而保存的图片为。
供参考:
$svg = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" style="overflow: hidden; position: relative; -moz-user-select: text;" xmlns="http://www.w3.org/2000/svg" width="794" version="1.1" height="122">
<image class="barcode" style="-moz-user-select: text;" xlink:href="images/52aab69d.png" preserveAspectRatio="none" height="40" width="266" y="30" x="380"></image>
<rect class="ref" style="-moz-user-select: text;" stroke="#000" fill="#000000" ry="0" rx="0" r="0" height="18" width="18" y="15" x="10"></rect></svg>';
答案 0 :(得分:2)
我找到了解决方案。我必须以完全不同的方式做到这一点。我从 - &gt;获得了帮助converting image to base64
既然图像已经嵌入到SVG中,php代码成功地将svg转换为PNG图像。刚用base64字符串替换了图像路径。
答案 1 :(得分:1)
xlink:href
应该是完全合格的域名。相对路径&#34; images / 52aab69d.png&#34;将通过您的Web浏览器解析,但可能不在服务器路径中。
<image class="barcode"
style="-moz-user-select: text;"
xlink:href="http://localhost/images/52aab69d.png"
preserveAspectRatio="none"
height="40" width="266"
y="30" x="380"></image>
答案 2 :(得分:0)
Puneet发现的有趣的解决方法并没有真正解决上述问题:
这是一个问题,特别是如果您的目的略有不同:例如,如果您需要将SVG转换为PostScript文件以便将其发送到打印机,那么Puneet提到的解决方案不起作用。
让我们分析问题:
Imagick没有转换只是嵌入式svg。 我尝试使用Gmagick,这是大公司使用的另一个库。没办法。
我尝试使用&#34;转换&#34;命令行工具(我在Debian 8环境中)。
convert withNestedSvgTag.svg withNestedSvgTag.ps
没办法。
解析SVG文件的解析器似乎完全忽略嵌套的<svg>
标记,只接受根<svg>
标记。
我有另一台服务器,(Debian 7和Imagick 3.1.0RC1),它就像一个sharm。
其他服务器似乎递归地呈现每个svg嵌套标记。
这意味着问题不在于SVG文件或PHP代码(考虑Imagick class库只包装Imagemagick)。
因此,总之,真正的解决方案是:
1.1 - 修改Imagemagick代码(我将写给在bug部分报告问题的开发人员社区)
1.2 - 用标签替换另一个标签。
1.2是另一种解决方法,我知道,但它似乎有效,显然你必须正确设置组标签中元素的大小。