PHP Imagick 转换 SVG 而无需抗锯齿

问题描述 投票:0回答:3

我正在尝试编写一个 PHP 函数来转换 SVG 图像而不进行任何抗锯齿(以便最终的 PNG 是块状的并且仅包含 SVG 中指定的颜色)。

等效的命令行是:

convert +antialias /path/to.svg /path/to.png

我假设我需要使用 PHP 的 Imagick::setOption 方法来传入“+antialias”,但文档非常稀疏。

以下代码片段将写入一个 PNG 文件,但没有任何选项可以阻止渲染抗锯齿像素:

$image = new Imagick();

// None of these have any affect - output image is always antialiased.
$image->setOption('+antialias', true);
$image->setOption('-antialias', true);
$image->setOption('+antialias', 'true');
$image->setOption('-antialias', 'true');
$image->setOption('antialias', true);
$image->setOption('antialias', false);
$image->setOption('antialias', 'true');
$image->setOption('antialias', 'false');

$image->readImage('/path/to.svg');
$image->writeImage('/path/to.png');

任何帮助都会很棒,谢谢。

php svg imagemagick
3个回答
2
投票

这不是对 SVG 等矢量文件进行抗锯齿的好方法。命令行中的正确方法是在读取文件之前设置所需的密度,然后调整大小以补偿使用大密度时的大放大倍数。例如

convert -density 288 image.svg -resize 25% image.png

标称密度(默认)为 72。因此 288 = 72*4。因此,除非您想要更大的输出,否则我们之后会调整大小 1/4 = 25%。然后按更大的值调整大小。

在 PHP Imagick 中,您可以创建一个新的 Imagick() 实例。然后设置所需的密度。然后读取输入的SVG。然后调整大小。然后设置PNG格式并保存到磁盘。请参阅 setImageResolution 以设置 Imagick 中的密度。请参阅https://www.php.net/manual/en/imagick.setimageresolution.php


2
投票

不幸的是,我认为你想要的东西是不可能的。 ImageMagick 使用 Inkscape 来渲染 SVG,而 Inkscape 没有命令行选项来禁用抗锯齿功能。

https://graphicdesign.stackexchange.com/questions/138075/export-svg-without-anti-aliasing-in-inkscape-1-0-by-command-line

您可以以高分辨率渲染,然后进行最近邻下采样。它会减少可见的抗锯齿效果,但您仍然会得到一些 SVG 文件中没有的颜色。


0
投票

抗锯齿可以使用Imagick PHP模块禁用,但不能通过预期的方法禁用。正如这个 Imagick GitHub 问题中所解释的,禁用抗锯齿的正确方法是

$imagick->setAntiAlias(FALSE);

使用

$imagick->setOption()
似乎根本不起作用,并且 PHP 手册目前没有
setAntiAlias()
的条目。我已经在我自己的图像生成脚本中对此进行了测试,并且它有效。我禁用抗锯齿功能的原因是,我需要有一种方法从图像中获取颜色样本并将它们映射到定义的调色板,而无需抗锯齿像素生成调色板中未定义的颜色。

© www.soinside.com 2019 - 2024. All rights reserved.