Delphi 6:如何通过TextOut()方法显示大尺寸高质量文本?

时间:2010-10-07 17:00:16

标签: delphi fonts timage true-type-fonts

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

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

1 个答案:

答案 0 :(得分: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必须与表单具有相同的背景颜色,因为在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;

Sample Text Output http://privat.rejbrand.se/sampletext.png
(High-Res)