ImageMagick 忽略 SVG 中的样式表(使用 php-imagick 转换为 PNG)
ImageMagick ignores style sheets in SVG (conversion to PNG with php-imagick)
我正在使用我在 PHP 中使用 ImageMagick 加载的 SVG 模板,将一些值插入 DOM,然后将其转换为 PNG。在我的本地开发环境中,这工作正常,但在我的远程网络服务器上却不行,生成的图像大部分是黑色的。
ImageMagick 似乎无法读取样式sheet 声明并应用类。我试图找出原因,但没有成功。我没有得到异常,其他线程暗示旧版本的 ImageMagick 可能有这个问题,但似乎版本是最新的。
我有点困惑PHPInfo 说模块版本是 3.4.4,但在 2017 年发布,而 ImageMagick 网站说 3.4.4 是在 12/2020 发布的。这有意义吗?我的本地开发环境使用相同的版本,但有一些附加信息 (3.4.4.r66.g448c1cd),发布日期为 2021-01-30。所以我不确定我是否在网络服务器上使用当前版本。
默认情况下,imagick 模块无法处理 SVG 文件类型,因此我安装了“libmagickcore-6.q16-3-extra”并重新加载了 php 和 nginx。从那时起,我得到了 PNG,但没有应用 sheet 样式。
服务器信息: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 上看到的那样,我没有找到如何将 delegete 更改为 Inkscape for php-imagick.
我已经没有想法了,真的希望你能帮我解决这个问题。
ImageMagick 可以使用 3 种不同的 SVG 渲染器中的任何一种。按照结果质量的顺序,一个是 Imagemagick 内部 MSVG/XML 渲染器,其次是 RSVG 代理,最后一个是 Inkscape。您可能在一个有效的系统上使用后者之一,在给出黑色结果的系统上使用内部系统。我建议你在两个系统上都安装 Inkscape,然后再测试。如果 ImageMagick 可以找到它,它将使用 Inkscape,否则如果找不到 RSVG,它将默认使用 MSVG。 RSVG 需要作为委托库安装,但 Inkscape 可以单独安装。
我正在使用我在 PHP 中使用 ImageMagick 加载的 SVG 模板,将一些值插入 DOM,然后将其转换为 PNG。在我的本地开发环境中,这工作正常,但在我的远程网络服务器上却不行,生成的图像大部分是黑色的。
ImageMagick 似乎无法读取样式sheet 声明并应用类。我试图找出原因,但没有成功。我没有得到异常,其他线程暗示旧版本的 ImageMagick 可能有这个问题,但似乎版本是最新的。
我有点困惑PHPInfo 说模块版本是 3.4.4,但在 2017 年发布,而 ImageMagick 网站说 3.4.4 是在 12/2020 发布的。这有意义吗?我的本地开发环境使用相同的版本,但有一些附加信息 (3.4.4.r66.g448c1cd),发布日期为 2021-01-30。所以我不确定我是否在网络服务器上使用当前版本。
默认情况下,imagick 模块无法处理 SVG 文件类型,因此我安装了“libmagickcore-6.q16-3-extra”并重新加载了 php 和 nginx。从那时起,我得到了 PNG,但没有应用 sheet 样式。
服务器信息: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 上看到的那样,我没有找到如何将 delegete 更改为 Inkscape for php-imagick.
我已经没有想法了,真的希望你能帮我解决这个问题。
ImageMagick 可以使用 3 种不同的 SVG 渲染器中的任何一种。按照结果质量的顺序,一个是 Imagemagick 内部 MSVG/XML 渲染器,其次是 RSVG 代理,最后一个是 Inkscape。您可能在一个有效的系统上使用后者之一,在给出黑色结果的系统上使用内部系统。我建议你在两个系统上都安装 Inkscape,然后再测试。如果 ImageMagick 可以找到它,它将使用 Inkscape,否则如果找不到 RSVG,它将默认使用 MSVG。 RSVG 需要作为委托库安装,但 Inkscape 可以单独安装。