4

TCanvas.TextOut()を使用してテキスト文字列を出力するTImageコンポーネントがあります。TImageの高さと幅を50ピクセルX(TextWidth)ピクセルのような大きなサイズに設定し、Canvasフォントの高さを48ピクセルのような少し小さいサイズに設定しました。次に、TImageのビットマップをメインCanvasにBitBlt()します。画面に表示されるのは、ひどくギザギザになっている大きな細い文字です。代わりに私が欲しいのは、滑らかに見える太いジャンボ文字です。TImage / BitBltコンボを使用する理由は、テキストのサイズ変更とアルファブレンディングをその場で行う必要があるためです。

大きく滑らかな文字を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を使用している場合(非常に奇妙な理由で、デフォルトでは無効になっています)、テキストは滑らかである必要があります。必ず最新のフォントを使用してください。それらのほとんどは機能しますが、MSSansSerifなどの非常に古いフォントはClearTypeを使用してスムージングできません。

また、当然のことながら、bmテキストがに描画されるときにアルファブレンディングが発生するため、フォームと同じ背景色を持つことが不可欠です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 に答える