【问题标题】:ImageMagick ignores style sheets in SVG (conversion to PNG with php-imagick)ImageMagick 忽略 SVG 中的样式表(使用 php-imagick 转换为 PNG)
【发布时间】:2021-05-27 16:04:12
【问题描述】:

我正在使用一个 SVG 模板,我在 PHP 中使用 ImageMagick 加载该模板,将一些值插入 DOM,然后将其转换为 PNG。在我的本地开发环境中,这可以正常工作,但在我的远程 Web 服务器上却不行,生成的图像大部分是黑色的。

ImageMagick 似乎无法读取样式表声明并应用类。我试图找出原因,但没有任何成功。我没有收到异常,其他线程暗示 ImageMagick 的旧版本可能会出现此问题,但似乎该版本是最新的。

我有点困惑 PHPInfo 说模块版本是 3.4.4 但在 2017 年发布,而 ImageMagick 网站说 3.4.4 于 2020 年 12 月发布。这有意义吗?我的本地开发环境使用相同的版本,但带有一些附加信息 (3.4.4.r66.g448c1cd),发布日期为 2021 年 1 月 30 日。所以我不确定我是否在网络服务器上使用当前版本。

默认情况下,imagick 模块无法处理 SVG 文件类型,因此我安装了“libmagickcore-6.q16-3-extra”并重新加载了 php 和 nginx。从那以后,我得到了 PNG,但没有应用样式表。

服务器信息:Debian GNU/Linux 9.9 (stretch), PHP7.3, nginx/1.10.3

这就是我的 SVG 开头的样子:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px"
   width="975" height="579.05542" viewBox="0 0 974.99995 579.05544" xml:space="preserve" id="svg_score">
   <defs id="defs">
      <style type="text/css" id="style">
         @font-face {
            font-family: SFProDisplay-Regular;
            src: url('sfprodisplay-regular.ttf');
         }
         .st0 {
            fill: #FFFFFF;
         }
         .st1 {
            fill-rule: evenodd;
            clip-rule: evenodd;
         }
         .st2 {
            clip-path: url(#SVGID_10_);
         }
         .st3 {
            clip-path: url(#SVGID_12_);
         }
         .st4 {
            fill: #77af42;
            stroke: #000000;
            stroke-width: 2.11;
            stroke-linejoin: round;
            stroke-miterlimit: 10;
         }
         .st11 {
            fill: none;
            stroke: #FFFFFF;
            stroke-width: 3;
            stroke-miterlimit: 10;
         }
         .filledstar {
            fill: #FFFFFF;
            stroke: #FFFFFF;
            stroke-width: 3;
            stroke-miterlimit: 10;
         }
         .value {
            font-style: normal;
            font-variant: normal;
            font-stretch: normal;
            font-family: SFProDisplay-Regular;
            font-size: 36.3px;
            letter-spacing: -.7;
         }
      </style>
   </defs>

我也尝试将 style 标签放在 defs 标签之外,但这也不起作用。 一个选项可能是将 SVG 委托更改为 Inkscape,但这使我认为这个问题更加复杂,正如我在我的开发 ImageMagick 上看到的那样,我没有找到如何将委托更改为 Inkscape 的 php-imagick .

我已经没有想法了,真的希望你能帮助我解决这个问题。

【问题讨论】:

    标签: php svg debian imagemagick webserver


    【解决方案1】:

    ImageMagick 可以使用 3 种不同的 SVG 渲染器中的任何一种。按照生成的质量顺序,一个是 Imagemagick 内部 MSVG/XML 渲染器,第二个是 RSVG 委托,最后一个是 Inkscape。您可能在一个正常工作的系统上拥有后者之一,而在给出黑色结果的系统上拥有一个内部系统。我建议您在两个系统上都安装 Inkscape,然后再次测试。如果 ImageMagick 可以找到它,它将使用 Inkscape,否则如果找不到 RSVG,则默认使用 MSVG。 RSVG 需要作为委托库安装,但 Inkscape 可以单独安装。

    【讨论】:

    • 啊,很酷,它有效!我已经在我的开发机器上安装了 Inkscape(作为 GUI 应用程序)——我不知道 ImageMagick 会自动使用它作为委托,而无需我进行任何手动配置。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2012-04-08
    • 2017-07-26
    • 1970-01-01
    • 2016-06-13
    相关资源
    最近更新 更多