svg中的嵌入图像在将svg转换为png时消失

时间:2014-04-22 11:18:27

标签: php svg imagemagick

请帮忙。我使用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,它会给我一个正确的图像。 output of echo $svg;

而保存的图片为enter image description here

供参考:

$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>';

3 个答案:

答案 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发现的有趣的解决方法并没有真正解决上述问题:

  1. 让svg A 嵌入另一个svg文件 B.svg
  2. B 转换为其他格式 - 让我们说png-使用Imagick
  3. A 未处理且未在转换后的文件中显示 B.png
  4. 这是一个问题,特别是如果您的目的略有不同:例如,如果您需要将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是另一种解决方法,我知道,但它似乎有效,显然你必须正确设置组标签中元素的大小。