德尔福6 : How can I display large size high quality Text via the TextOut() method?

标签 delphi fonts timage truetype

我有一个 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;

Sample Text Output
(High-Res)

关于德尔福6 : How can I display large size high quality Text via the TextOut() method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3883987/

相关文章:

mysql - 如何避免在此代码中在数据库中存储重复项?

windows - 防止任务管理器杀死进程,相反

delphi - 使用 TArray<T> 而不是 Array of T 的原因是什么?

css - 在哪些操作系统或浏览器上 CSS 字体系列名称区分大小写

ios - 如何根据 View 高度按比例增加字体大小

delphi - 在Delphi编译的可执行文件中更改图像

delphi - 获取 Timage 内位图的坐标

delphi - 如何将字段接口(interface)注入(inject)到对象中

iphone - 如何设置 UILabel 以使用 Arial Narrow(以编程方式),就像我们在 Storyboard上所做的那样?

delphi - 在Timage组件中分部分加载大图像