Rob*_*ler 4 delphi fonts timage truetype
我有一个TImage组件,我使用TCanvas.TextOut()打印文本字符串.我将TImage的高度和宽度设置为50像素X(TextWidth)像素的大尺寸,并将Canvas字体高度设置为略小于48像素的高度.然后我将BitBlt()TImage的位图放到主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;
Run Code Online (Sandbox Code Playgroud)
如果您使用的是现代版本的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));
Run Code Online (Sandbox Code Playgroud)
之前
bm.TextOut(...)
Run Code Online (Sandbox Code Playgroud)
我们正在谈论同样的事情:这不是很顺利吗?
procedure TForm3.FormPaint(Sender: TObject);
begin
Canvas.Font.Name := 'Segoe UI';
Canvas.Font.Height := 64;
Canvas.TextOut(10, 10, 'This is an example.');
end;
Run Code Online (Sandbox Code Playgroud)
示例文本输出http://privat.rejbrand.se/sampletext.png
(高分辨率)