gpt4 book ai didi

delphi - "Additive"TCanvas 上的文本渲染?

转载 作者:行者123 更新时间:2023-12-03 15:20:15 27 4
gpt4 key购买 nike

令我惊讶的是,我发现在 TCanvas 上重复渲染文本在某种程度上是“附加的”。我意识到设置 Canvas.Brush.Style:=bsClear 是问题的原因,但我确实需要透明且重复地渲染文本(即在 OnPaint 中) > 事件)。执行此操作后,文本看起来不太好。

如何避免这种情况?

这是一些示例代码;如果您多次单击名为 btn1 的 TButton,您就可以看到效果。

procedure TForm1.btn1Click(Sender: TObject);
begin
Form1.Canvas.Brush.Style:=bsClear; //if you omit this, everything is OK.
Form1.Canvas.Font.Color:=clRed;
Form1.Canvas.Font.Name:='Times new Roman';
Form1.Canvas.Font.Style:=[fsBold];
Form1.Canvas.Font.Size:=12;
Form1.Canvas.TextOut(50,50,'www.stackoverflow.com');
end;

最佳答案

这是因为 GDI 在绘制文本时应用了一些抗锯齿功能,以使文本看起来更好。这会导致绘制文本外部的一些背景像素在文本附近被涂成红色/微红色。当您下次绘制文本时,如果不清除背景,抗锯齿会导致这些微红像素变得更红。

您可以将背景清除为 Arioch 'The在他的answer中指出,或者如果您确实需要透明且重复地渲染文本,您可以关闭抗锯齿功能。

TOndrej this answer提供了一个很好的功能用于指定文本输出质量。使用它,代码变成:

begin
Form1.Canvas.Brush.Style:=bsClear;
Form1.Canvas.Font.Color:=clRed;
Form1.Canvas.Font.Name:='Times new Roman';
Form1.Canvas.Font.Style:=[fsBold];
Form1.Canvas.Font.Size:=12;
SetFontQuality(Form1.Canvas.Font, NONANTIALIASED_QUALITY); // <--
Form1.Canvas.TextOut(50,50,'www.stackoverflow.com');
end;

关于delphi - "Additive"TCanvas 上的文本渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12471982/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com