我有一个 TImage 组件,我使用 TCanvas.TextOut() 打印文本字符串。我将 TImage 的高度和宽度设置为较大的尺寸,如 50 像素 X (TextWidth) 像素,并将 Canvas 字体高度设置为较小的尺寸,如 48 像素。然后我将 TImage 的位图 BitBlt() 到主 Canvas 上。我在屏幕上看到的是又大又瘦的字母,而且锯齿状得很厉害。相反,我想要的是看起来光滑的粗大字母。使用 TImage/BitBlt 组合的原因是因为我需要动态调整文本大小和 alpha 混合。
将大而平滑的字母打印到 TImage 位图上的最简单方法是什么?
最佳答案
您是否从不显示TImage
?那么你真的应该使用离屏位图。这是实现双缓冲(无闪烁渲染)的一种非常常见的技术。
例如,
var
bm: TBitmap;
procedure InitOffscreenBitmap;
begin
bm := TBitmap.Create;
bm.SetSize(bmWidth, bmHeight);
end;
procedure DrawBitmap;
begin
// Draw on bm
end;
procedure Swap;
begin
BitBlt(Canvas.Handle, X, Y, bmWidth, bmHeight, bm.Canvas.Handle, 0, 0, SRCCOPY)
end;
如果您使用的是现代版本的 Windows(例如 Vista+)或启用了 ClearType 的 Windows XP(由于某些非常奇怪的原因,默认情况下禁用它),文本应该是平滑的。只要确保您使用现代字体即可。大多数字体都可以,但是非常旧的字体(例如 MS Sans Serif)无法使用 ClearType 进行平滑处理。
此外,自然地,bm
必须具有与表单相同的背景颜色,因为在 bm
上绘制文本时会发生 alpha 混合。因此,如果表单是 clRed
(由于某些不正当的原因),您需要这样做
bm.Canvas.Brush.Color := clRed;
bm.Canvas.Brush.Style := bsSolid;
bm.FillRect(Rect(0, 0, bmWidth, bmHeight));
之前
bm.TextOut(...)
我们在谈论同一件事:这还不够流畅吗?
procedure TForm3.FormPaint(Sender: TObject);
begin
Canvas.Font.Name := 'Segoe UI';
Canvas.Font.Height := 64;
Canvas.TextOut(10, 10, 'This is an example.');
end;
关于德尔福6 : How can I display large size high quality Text via the TextOut() method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3883987/