【问题标题】:Issue with setVectorGraphics method in Imagick?Imagick 中的 setVectorGraphics 方法有问题吗?
【发布时间】:2015-03-23 18:55:49
【问题描述】:

我正在处理一项需要解析 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 库中的错误吗?如果是这样,有没有办法解决这个问题?

谢谢!

【问题讨论】:

  • 我很确定对 ImageMagick 的库调用不起作用,这就是为什么在 phpimagick.com/ImagickDraw 上无法查看该示例,因为它不起作用。有人需要在imagemagick.org/discourse-server/viewforum.php?f=3 向上游报告问题,这可能涉及用 C 编写一个示例,这就是为什么它在我的待办事项清单上,而不是已完成的事项清单上。
  • @Danack 不用担心 - 下面介绍的解决方案是一种可接受的解决方法。感谢优秀的图书馆和教程!

标签: php svg imagemagick imagick


【解决方案1】:

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

正确。在本例中,PHP 对 ImageMagick 的 C-API 的实现是完整的。

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

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

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

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

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

【讨论】:

  • 太棒了 - 这个解决方案非常有效。我确实查看了 getVectorGraphics 的 SVG 输出,但对格式不够熟悉,无法发现丢失的标签。非常感谢您的帮助!抱歉,我显然缺乏投票所需的声誉点:P
  • @TarekSami 很高兴为您提供帮助。只需“接受”此答案即可帮助获得声誉积分。
  • @emcconville 你似乎对 Imagick 有点了解,而且它的 bug。您能否在github.com/mkoppanen/imagick 处打开您想解决的其他问题?例如我最近才发现 setVectorGraphics 的这个问题 - github.com/mkoppanen/imagick/issues/82
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2013-04-04
  • 2013-12-08
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
相关资源
最近更新 更多