为什么要主要使用基于位图/光栅的图像处理库 (ImageMagick) 来修改矢量 SVG 图像?
- 首先让我为您指出正确的做法:
ImageMagick 应该主要用于读取和写入位图图像以及创建/写入 SVG 图像(如果需要,还可以使用其他基于矢量的格式,例如 EPS、PDF 等)。
而不是使用 ImageMagick/Imagick 进行转换(将矢量图像更改为位图并再次返回 - 失去质量)只需使用以下代码读取您的图像:
$image = file_get_contents($path1);
$svg_dom = new DOMDocument();
$tmp_obj = $svg_dom->getElementsByTagName("svg")->item(0);
$svg_width = floatval($tmp_obj->getAttribute("width"));
$svg_height = floatval($tmp_obj->getAttribute("height"));
$svg_viewbox = floatval($tmp_obj->getAttribute("vieWBox"));
然后我建议您使用裁剪调整计算新的 viewBox(为此创建一个函数)并将其设置回来,也可以选择设置新的宽度和高度:
$svg_viewBox = calculateCroppedView($svg_viewbox, $new_width, $new_height, $top, $left);
$tmp_obj->setAttribute("viewBox", $svg_viewBox);
$tmp_obj->setAttribute("width", $new_width."px");
$tmp_obj->setAttribute("height", $new_height."px");
file_put_contents('Cvilogpdfbackend/core/images/tempimage/'.$targetfile.'.svg', $svg_dom->saveXML());
注意:您并没有真正裁剪 SVG 图像(SVG 元素),只是将视图更改为它(例如缩放)。可以转换所有剪切路径、形状、文本等,但需要大量编码。无论哪种方式,目标都是保持(矢量)图像质量。
有关 SVG viewBox 属性的出色解释,请阅读本节:
https://css-tricks.com/scale-svg/#the-viewbox-attribute
- 回答您的问题:
此错误表明您的网络服务器中的 ImageMagick 找不到或没有安装(免费)potrace 软件,该软件对位图图像进行实际矢量化。
注意:您需要 ImageMagick 版本 7,因为旧版本只是将位图图像和数据编码 (base64) 字符串嵌入到 SVG 图像标签,或者可能使用了奇怪的转换 - 取决于 ImageMagick 版本 -将点转换为 1px SVG 圆形标签。由于上述原因,安装的 ImageMagick 也需要与 Imagick 的版本相同。
Potrace 软件命令行在 ImageMagick/Imagick 安装的 delegates.xml 中设置,ImageMagick 或 Imagick 需要在 PATH(环境变量)中找到 potrace。
我建议您联系您的网络托管服务提供商安装 Potrace,可以在这里下载:
http://potrace.sourceforge.net/#downloading
然后你必须测试你的脚本,很可能你的网络托管服务提供商已经通过安装 Potrace 解决了这个问题。也许需要将它的路径添加到用户/系统 PATH 变量中,这实际上应该可以解决您的问题。
如果没有,您可以尝试在 PHP 中使用 ImageMagick(转换或现在重命名为 magick,主程序)和 potrace 使用 exec() 命令,但您的虚拟主机必须允许这样做,因为它通常在 PHP 配置中被禁止。
- 寻求其他帮助:
好吧,在 SO 或 ImageMagick 支持论坛上提出一个问题,该论坛基于他们的主站点论坛(您无法再注册)现在在这里:
https://github.com/ImageMagick/ImageMagick/discussions