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)
我认为你走错了路。Image Magick 基本上是一个面向像素的库。虽然渲染背景图像可能是配置问题,但您的图片显示您想要实现的字体“嵌入”并未发生。真正的问题就在这里。
您想要实现的是表示 SVG 文件内的字体信息。有两种方法可以做到这一点,而 IM 绝对不支持这两种方法:
根据您的描述,我认为您应该瞄准第二种变体。您基本上会用元素交换<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)