PHP Imagick 描边出现过度填充

PHP Imagick stroke appears over fill

正在尝试制作一个简单的水印,该水印由图像顶部的白色文本和黑色轮廓组成。问题是描边颜色出现在(或至少影响)填充颜色上。 "affecting" 的意思是,例如,当我尝试使用红色描边颜色时,填充颜色会变成稍微亮一点的红色(即红色 + 白色),因为我的填充颜色是白色。

图片

代码:

$watermark_text = new ImagickDraw();
$watermark_text->setFont($font);
$watermark_text->setFontSize(25);
$watermark_text->setFillColor('white');
$watermark_text->setStrokeColor('#000000');
$watermark_text->setStrokeWidth(3);
$watermark_text->setStrokeOpacity(0.4);
$watermark_text->setStrokeAntialias(false);
$watermark_text->setGravity(Imagick::GRAVITY_SOUTHEAST);

我为 see/show 指定了 .4 不透明度,填充和实心确实存在,只是不完全符合我的预期。

我希望填充颜色为 100% 白色,请问为什么不是这样?

谢谢


编辑

我明白发生了什么。描边宽度使其在内部与填充重叠。有没有办法确保填充颜色出现在描边的顶部,使白色为 100% 白色?

对于笔划宽度为 3 的笔划宽度,您的磅值似乎太小了。您所体验到的效果可以通过以下示例进行演示。

foreach(range(1,5) as $strokeWidth) {
    // ... your example here ...
    $watermark_text->setStrokeWidth($strokeWidth);
    $watermark_text->annotation(0, 0, 'Font Width ' . $strokeWidth);
}

最简单的解决方案是 clone 您的 ImagickDraw,并绘制相同的文本两次。首先只是轮廓 w/out 填充,实际填充的文本超过第一个。如果您不使用矢量,您也可以放弃不透明度步骤以支持 rgba 颜色。

// Create white text w/ common options
$font = 'Helvetica-Neue-Bold';
$watermark_text = new ImagickDraw();
$watermark_text->setFillColor('white');
$watermark_text->setFont($font);
$watermark_text->setFontSize(25);
$watermark_text->setStrokeAntialias(false);
$watermark_text->setStrokeColor('none');
$watermark_text->setStrokeWidth(0);
$watermark_text->setGravity(Imagick::GRAVITY_SOUTHEAST);
// Clone & set stroke attributes
$watermark_outline = clone $watermark_text;
$watermark_outline->setFillColor('none');
$watermark_outline->setStrokeColor('rgba(0,0,0, 0.4)');
$watermark_outline->setStrokeWidth(3);
// Set the text for both, and offset one to match stroke width
$watermark_outline->annotation(0, 0, 'Draw On Top');
$watermark_text->annotation(3, 0, 'Draw On Top');
// Draw stroke, then text
$image = new Imagick();
$image->setSize(200, 35);
$image->readImage('XC:LightGoldenrod');
$image->drawImage($watermark_outline);
$image->drawImage($watermark_text);
$image->writeImage('out.png');