在Imagick中使用setVectorGraphics方法的问题?

时间:2015-03-23 18:55:49

标签: php svg imagemagick imagick

我正在处理一项任务,需要解析SVG路径数据,以便在Imagick中用作剪辑蒙版...现在,我在尝试使用setVectorGraphics方法时遇到错误 - 以下代码会产生错误消息,如:

致命错误:未捕获的异常'ImagickException',消息'无法绘制图像'

$draw = new \ImagickDraw();
$draw->setFillColor("red");
$draw->circle(20, 20, 50, 50);
$draw->setFillColor("blue");
$draw->circle(50, 70, 50, 50);
$draw->rectangle(50, 120, 80, 150);
//Get the drawing as a string
$SVG = $draw->getVectorGraphics();

$draw2 = new \ImagickDraw();
$draw2->setVectorGraphics($SVG);
$imagick = new \Imagick();
$imagick->newImage(200, 200, 'white');
$imagick->setImageFormat("png");
$imagick->drawImage($draw2);
header("Content-Type: image/png");
echo $imagick->getImageBlob();

(代码来自this demo

我很确定Imagick和ImagickDraw在这里的用法是正确的......这是Imagick库中的一个错误吗?如果是这样,有什么方法可以解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

我很确定Imagick和ImagickDraw在这里的使用是正确的

正确。在这种情况下,PHP的ImageMagick C-API实现已经完成。

  

...这是Imagick库中的一个错误吗?

是。此功能有问题的历史记录,并且ImageMagick版本的行为已发生变化。确保您拥有最新版本,编写测试用例并提交错误报告。

  

如果是这样,有什么方法可以解决这个问题吗?

ImagickDraw::getVectorGraphics返回一串xml节点,但不是完整的XML文档。您的调用代码需要生成缺少的父节点。

$SVG = $draw->getVectorGraphics();
// ....
$draw2->setVectorGraphics('<root>' . $SVG . '</root>');