如何使用PHP Imagick读取指定大小的SVG文件?

4

I have the following code:

$image = new Imagick();
$image->setBackgroundColor(new ImagickPixel('green'));
$image->setSize(20,20);
$image->readImageBlob(file_get_contents('./some/path/image.svg'));

它可以很好地加载SVG,但setSize完全被忽略了。它按照其定义呈现为550x100:
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    width="550px" height="100px" viewBox="0 0 550 100" 
    enable-background="new 0 0 550 100" xml:space="preserve">

有没有人有将SVG文件与setSize协调的经验?


你想调整它的大小吗?我发现通过将SVG作为XML加载更容易。 - k102
@k102 你的意思是在传递给readImageBlob之前修改XML吗?那可能会起作用。 - Matt
嗯...在我的情况下,我只需要调整SVG图像的大小并在浏览器中显示它。你为什么需要Imagick? - k102
2个回答

11

setSize() 函数仅适用于原始图像格式,而不是 SVG。您需要使用 scaleImage() 替代...

$image = new Imagick();
$image->setBackgroundColor(new ImagickPixel('green'));
$image->readImage('./some/path/image.svg');
$image->scaleImage(20,20);

顺便提一下,如果您将SVG图像缩小到较小的尺寸(就像在这种情况下一样),那么这将很好地运作,但对于任何需要将其放大的人,您需要做另一件事。 如果您只是像上面那样更改大小,它将出现锯齿状和像素化。 在这种情况下,您需要使用setResolution()来增加分辨率,如下所示:

$image = new Imagick();
$image->setResolution(2000,2000);
$image->setBackgroundColor(new ImagickPixel('green'));
$image->readImage('./some/path/image.svg');
$image->scaleImage(1000,1000);

setResolution()函数的实际值应计算为72 * (final_size / original_size)(我认为这是正确的公式)。但是任何至少等于该值或更高的值也可以很好地工作。


3

关于放大SVG图像:使用我目前的设置(ImageMagick 6.7.8-1 2012-10-03 Q16SVGrw+),保存在90 x 30像素大小的SVG图像即使使用setResolution()setImageResolution()也无法放大。如果我将该SVG重新保存为较高的尺寸,如9000 x 3000,那么我就可以安全地使用上述方法调整其大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接