使用ImagickDraw绘制单像素线时出现奇怪的阴影/模糊

时间:2015-06-27 16:43:52

标签: php imagemagick imagick

所以我今天想和Imagick画一条线。听起来很简单吧?

这是我的代码:

$image = new Imagick();
$image->newImage(100, 100, 'white');
$image->setImageFormat('png');

$line_color = new ImagickPixel('#555555');
$line_weight = 1;

$line = new ImagickDraw();

$line->setResolution(100, 100);
$line->setStrokeWidth($line_weight);
$line->setStrokeColor($line_color);

$line->line(20, 20, 20, 60);

$image->drawImage($line);
$image->writeImage('test.png');

没什么好奇的,我创建了一个100x100的白色图像,我将线条颜色设置为555555,线条权重设置为1,我创建了我的ImagickDraw对象并告诉他画一条线。

问题是输出如下所示:http://i.stack.imgur.com/hM8QS.png

首先看起来很好,直到你放大并看到这个:http://i.stack.imgur.com/O6Yie.png

我尝试了几种颜色,重量和分辨率的设置,但我无法摆脱这种奇怪的阴影/模糊效果。除了积分之外,它几乎可以用任何东西绘制(线条,矩形等......)。因此,如果我想要,我可以使用一系列点和一个简单的for循环创建我的单像素行,但这样做真的很麻烦。特别是因为我不打算只画这一行。

那么,任何人都知道发生了什么?我怎样才能摆脱这种行为?

1 个答案:

答案 0 :(得分:0)

您看到的效果是由于启用了笔触抗锯齿。您可以使用setStrokeAntialias禁用它。

$line->setResolution(100, 100);
$line->setStrokeWidth($line_weight);
$line->setStrokeColor($line_color);
$line->setStrokeAntialias(false);

重新绘制笔划抗锯齿,同时绘制曲线以避免锯齿伪影。

很简单,在我的测试中,当笔触颜色设置为#555555(或等效表示)时,这会导致线条完全消失,就像在代码示例中一样。但是,将颜色设置为#545454或#565656会导致正确绘制线条,而不会出现您描述的阴影/模糊效果。