使用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对象并告诉他画一条线。

问题是输出看起来是这样的:https://i.stack.imgur.com/hM8QS.png

一开始看起来不错,直到放大后看到:https://i.stack.imgur.com/O6Yie.png

我尝试了几种颜色、权重和分辨率的设置,但我无法摆脱这种奇怪的阴影/模糊效果。它几乎可以处理我画的任何东西(直线、矩形等),除了点。所以如果我想的话,我可以用一系列的点和一个简单的for循环来创建我的单像素线,但这真的会很乏味。尤其是因为我不会只画这条线。

那么,有人知道发生了什么吗?我该如何摆脱这种行为?

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

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

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

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

最新更新