所以我今天要和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会导致正确绘制线条,而不会出现您所描述的阴影/模糊效果。