【问题标题】:Getting error message on Cpanel using Imagick使用 Imagick 在 Cpanel 上获取错误消息
【发布时间】:2020-10-18 11:10:11
【问题描述】:

我正在使用 Imagick 编辑和保存 svg 图像。 裁剪后保存 svg 图像时出现错误。

这是我操作 svg 图片的代码:

 $image = new Imagick();
 $image->readImage($path1);    
 $image -> cropImage($rw*11.2, $sw*7.7, 0, 0);   
 $image->writeImage('Cvilogpdfbackend/core/images/tempimage/'.$targetfile.'.svg');

当我调用此函数时,我收到以下错误

PHP 致命错误:未捕获的 ImagickException:委托失败 `'potrace' --svg --output '%o' '%i'' @ 错误/delegate.c/InvokeDelegate/1897 在 /home/civilogc/public_html/resizeimage.php:19 堆栈跟踪: #0 /home/civilogc/public_html/resizeimage.php(19): Imagick->writeimage('Cvilogpdfbacken...') #1 {main} 在第 19 行的 /home/civilogc/public_html/resizeimage.php 中抛出

如何解决这个问题?

【问题讨论】:

    标签: php svg cpanel imagick


    【解决方案1】:

    为什么要主要使用基于位图/光栅的图像处理库 (ImageMagick) 来修改矢量 SVG 图像?

    1. 首先让我为您指出正确的做法:

    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

    1. 回答您的问题:

    此错误表明您的网络服务器中的 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 配置中被禁止。

    1. 寻求其他帮助:

    好吧,在 SO 或 ImageMagick 支持论坛上提出一个问题,该论坛基于他们的主站点论坛(您无法再注册)现在在这里:

    https://github.com/ImageMagick/ImageMagick/discussions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2011-03-16
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      相关资源
      最近更新 更多