Gmagick将SVG转换为透明背景的PNG

4

我有一个将SVG转换为PNG的问题。即使应该是透明的,背景仍然是白色。

示例代码:

$im = new Gmagick();
$im->readImageBlob('<?xml version="1.0"?>'.$svg);
$im->setImageBackgroundColor(new \GmagickPixel('transparent')); 
$im->setimagecolorspace(\Gmagick::COLORSPACE_TRANSPARENT); 
$im->scaleImage(1024,1024,1);
$im->setResolution ("300","300");
$im->setImageFormat('PNG32');
$im->setImageDepth(32);
$im->getImageBlob();

示例 SVG:

<svg width="640" height="480">
    <rect height="254" width="459" y="117" x="99" stroke-width="5" stroke="#000000" fill="#FF0000" />
    <rect width="241.35593" height="211.52542" x="387.7966" y="225.08475" />
</svg>

使用Graphic Magick我没有问题,例如命令行:

gm convert -size 1200x1200 -background none svg.svg svg.png

我该如何解决这个问题?


编辑:目前我使用的是这段代码

shell_exec("gm convert -resize ".$width."x".$height." -background none svg.svg svg.png");

这个方法能够运行,但我讨厌使用shell_exec,感觉很不干净。


我对Gmagick扩展没有经验,但在ImagickPixel中,您需要指定要转换为透明的图像,例如new ImagickPixel('transparent')。在您的情况下,您正在创建一个非透明图像$im = new Gmagick()。 - KiKMak
谢谢回复,但我只能使用Gmagick。 - S8N
1个回答

0
有点晚了,但是你必须使用方法“backgroundColor”而不是“imageBackgroundColor”,并且你必须将其放在“readImageBlob”之前,而不是之后。
所以你的代码应该像这样:
$im = new Gmagick();
$im->setBackgroundColor(new \GmagickPixel('transparent')); 
$im->readImageBlob('<?xml version="1.0"?>'.$svg);
$im->setimagecolorspace(\Gmagick::COLORSPACE_TRANSPARENT); 
$im->scaleImage(1024,1024,1);
$im->setResolution ("300","300");
$im->setImageFormat('PNG32');
$im->setImageDepth(32);
$im->getImageBlob();

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