使用 ImagickDraw 绘制单像素线时很奇怪 shadow/blur

Weird shadow/blur when drawing a single-pixel line with ImagickDraw

所以我今天想与 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

我尝试了几种颜色、粗细和分辨率的设置,但我无法摆脱这种奇怪的 shadow/blur 效果。除了点之外,它几乎可以用我画的任何东西(线、矩形等)来做到这一点。因此,如果我愿意,我可以使用一系列点和一个简单的 for 循环来创建我的单像素线,但这确实会变得乏味。特别是因为我不会只画这条线。

那么,有人知道发生了什么事吗?我怎样才能摆脱这种行为?

您看到的效果是由于启用了描边抗锯齿功能。您可以使用 setStrokeAntialias 禁用它。

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

在绘制曲线时重新启用描边抗锯齿以避免锯齿伪影。

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