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

Delphi 6:如何通过TextOut()方法显示大尺寸高质量文本?,delphi,fonts,timage,truetype,Delphi,Fonts,Timage,Truetype,我有一个TImage组件,可以使用TCanvas.TextOut()打印文本字符串。我将TImage的高度和宽度设置为50像素X(TextWidth)像素这样的大尺寸,并将画布字体高度设置为48像素这样的小尺寸。然后,我将位图BitBlt()放到主画布上。我在屏幕上看到的是非常参差不齐的又大又瘦的字母。我想要的是看起来很光滑的厚厚的巨型字母。使用TImage/BitBlt组合的原因是我需要动态调整文本的大小和alpha混合 对于我来说,最简单的方法是如何将大而平滑的字母打印到TImage位图中?

我有一个TImage组件,可以使用TCanvas.TextOut()打印文本字符串。我将TImage的高度和宽度设置为50像素X(TextWidth)像素这样的大尺寸,并将画布字体高度设置为48像素这样的小尺寸。然后,我将位图BitBlt()放到主画布上。我在屏幕上看到的是非常参差不齐的又大又瘦的字母。我想要的是看起来很光滑的厚厚的巨型字母。使用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(出于某些非常奇怪的原因,默认情况下禁用),则文本应平滑。只要确保使用现代字体即可。大多数都可以,但使用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;

您使用的是什么字体?你能张贴一张照片来展示你认为“非常参差不齐”吗?你好,Rob。字体确实是主要问题。请参阅我对Andreas回答的评论,了解更多详细信息。你好Andreas。结果大部分问题都是因为我的字体选择。Delphi6的默认选择并不像您指出的那样具有良好的伸缩性。按照你的建议,我试了一些新的,大部分问题都解决了。我相信我看到的剩余锯齿是由于我使用AlphaBlend()在传输过程中调整文本图像的大小,而不是每次使用不同的高度(像素)值重新打印文本图像,这可能不是必要的速度优化。感谢您提供有关ClearType的提示。我来看看。