在imagick php中使用svg原始数据生成SVG图像

DS9*_*DS9 5 php svg imagemagick imagick

我正在尝试使用svg原始数据创建svg图像,我从fabric js获取.我使用下面的代码使用svg原始数据生成svg但它无法正常工作.

public function generate_svg($raw_svg='',$prefix='',$folder_name='card_image')
{
    $file_name = '';       
    if($raw_svg!='')
    {
        try{           
            $file_name = uniqid($prefix).".svg";
            $image = new \Imagick();
            $image->readImageBlob($raw_svg);
            $image->setImageFormat("svg");
            $image->writeImage($folder_name.$file_name);
        } catch (ImagickException $ex) {
            echo $ex->getMessage();
        }
    }
     return $file_name;
}
Run Code Online (Sandbox Code Playgroud)

现在问题是背景图片有点像下面这样:

在此输入图像描述

那我该怎么做才能解决这个问题呢?

它应该如下所示(忽略方形和圆形),问题是整个背景看起来像黑色而不是bg图像:

在此输入图像描述

所以问题是背景图像没有加载,所以我必须添加额外的库来做那个或其他任何事情?

Imagick版本:6.7.7

    convert -list delegate | grep svg  

    cdr =>          "uniconvertor' '%i' '%o.svg'; /bin/mv '%o.svg' '%o"
    cgm =>          "uniconvertor' '%i' '%o.svg'; /bin/mv '%o.svg' '%o"
    dot =>          "dot' -Tsvg '%i' -o '%o"
    dxf =>          "uniconvertor' '%i' '%o.svg'; /bin/mv '%o.svg' '%o"
    fig =>          "uniconvertor' '%i' '%o.svg'; /bin/mv '%o.svg' '%o"
    svg =>          "rsvg-convert' -o '%o' '%i"

 convert -list format | grep SVG

 MSVG  rw+   ImageMagick's own SVG internal renderer
  SVG  rw+   Scalable Vector Graphics (XML 2.9.1)
 SVGZ  rw+   Compressed Scalable Vector Graphics (XML 2.9.1)
Run Code Online (Sandbox Code Playgroud)

ccp*_*rog 1

我认为你走错了路。Image Magick 基本上是一个面向像素的库。虽然渲染背景图像可能是配置问题,但您的图片显示您想要实现的字体“嵌入”并未发生。真正的问题就在这里。

您想要实现的是表示 SVG 文件内的字体信息。有两种方法可以做到这一点,而 IM 绝对不支持这两种方法:

  • 将字体转换为 SVG 字体格式并将其嵌入到文件中(生成大文件)
  • 将所有字形转换为路径(文本不再可编辑)

根据您的描述,我认为您应该瞄准第二种变体。您基本上会用元素交换<text>字符串中的元素<path>,否则写出 SVG 文件,包括收到的嵌入图像数据。

如何将文本转换为 SVG 路径?是对这个问题的较旧的看法。

EasySVG for PHP是一个由字形到路径转换问题产生的库,但前提是您已经拥有 SVG 格式的字体。对于 ttf 等典型桌面字体格式,您可能首先需要查看FontForge等字体转换工具。

您可能会通过Cairo获得直接的 svg 数据转换,但这只是一种预感,我还没有使用过它。

最后,作为一种解决方法,您可以将整个任务委托给 Inkscape。可以在命令行上调用它,而无需启动 GUI,如下所示

inkscape in.svg --export-text-to-path --export-plain-svg=out.svg
Run Code Online (Sandbox Code Playgroud)