4

我有一个 TImage 组件,我使用 TCanvas.TextOut() 打印一个文本字符串。我将 TImage 的高度和宽度设置为大尺寸,如 50 像素 X (TextWidth) 像素,并将 Canvas 字体高度设置为稍小一些,如 48 像素。然后我将 TImage 的位图 BitBlt() 放到主 Canvas 上。我在屏幕上看到的是又大又细的字母,它们非常锯齿状。我想要的是看起来很光滑的粗大字母。使用 TImage/BitBlt 组合的原因是因为我需要动态调整文本的大小和 alpha 混合。

对我来说,将大而平滑的字母打印到我的 TImage 位图的最简单方法是什么?

4

1 回答 1

9

你从不显示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(出于某种非常奇怪的原因,默认情况下它被禁用),文本应该是平滑的。只需确保使用现代字体即可。它们中的大多数都可以,但是使用 ClearType 无法平滑 MS Sans Serif 等非常旧的字体。

此外,自然地,必须bm具有与表单相同的背景颜色,因为在绘制文本时会发生 alpha 混合bm。所以如果表格是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;

示例文本输出
(高分辨率)

于 2010-10-07T17:20:28.243 回答