折线自动关闭 - 如何绘制开放的折线?
Posted
技术标签:
【中文标题】折线自动关闭 - 如何绘制开放的折线?【英文标题】:polyline auto-closes - how to draw an open polyline? 【发布时间】:2012-03-29 10:46:00 【问题描述】:我需要在 php 中绘制连续的线条。 GD显然做不到,但是imagick有折线功能。现在我的测试代码:
$image = new Imagick();
$image->newImage(100, 100, new ImagickPixel('white'));
$draw = new ImagickDraw();
$draw->setStrokeWidth(3);
$line = array(
array('x'=>10, 'y'=>10),
array('x'=>50, 'y'=>10),
array('x'=>70, 'y'=>40),
array('x'=>30, 'y'=>60),
);
$draw->polyline($line);
$image->drawImage($draw);
$image->setImageFormat('jpg');
$image->writeImage("test.jpg");
由于我无法理解的原因产生了一个封闭的(和填充的)多边形。这是怎么回事,我该如何解决?我希望它停在最后一点,而不是关闭或填充。
如果GD有解决方案,我也很高兴。不,我不能简单地将单独的线条串在一起,因为我想要线条的粗细。
【问题讨论】:
【参考方案1】:可以通过在一个方向上绘制一条开放的折线,然后使用相同的点表返回,没有第一个和最后一个点(它们不是必需的)
所以,如果你有
$line = array(
array('x'=>10, 'y'=>10),
array('x'=>50, 'y'=>10),
array('x'=>70, 'y'=>40),
array('x'=>30, 'y'=>60),
);
你应该添加
$line[] = array('x'=>70, 'y'=>40);
$line[] = array('x'=>50, 'y'=>10);
然后
$draw->polyline($line);
你会得到你想要的。
【讨论】:
【参考方案2】:看GD折线的文档。也许你想要的:http://bonzoli.com/sourcecode/index.php/man/GD::Polyline
【讨论】:
不幸的是,GD 的 PHP 接口没有公开 imagepolyline() 函数。【参考方案3】:您应该同时定义描边和填充颜色,否则 Imagick 将使用填充颜色“填充”由线条和起点和终点限定的区域。这些值的默认值为“white”和“black”。
此代码将按预期工作,即它产生一个镜像的“c”形对象,黑色线条宽度为 3 像素:
$image = new Imagick();
$image->newImage(100, 100, 'white');
$draw = new ImagickDraw();
$draw->setStrokeWidth(3);
$draw->setStrokeColor ("black");
$draw->setFillColor ("none");
$line = array(
array('x'=>10, 'y'=>10),
array('x'=>50, 'y'=>10),
array('x'=>70, 'y'=>40),
array('x'=>30, 'y'=>60),
);
$draw->polyline($line);
$image->drawImage($draw);
$image->writeImage("test.jpg");
【讨论】:
以上是关于折线自动关闭 - 如何绘制开放的折线?的主要内容,如果未能解决你的问题,请参考以下文章