Delphi 6: Как я могу отобразить высококачественный текст большого размера с помощью метода TextOut ()? - PullRequest
4 голосов
/ 07 октября 2010

У меня есть компонент TImage, в который я печатаю текстовую строку с использованием TCanvas.TextOut (). Я установил для TImage высоту и ширину большого размера, например, 50 пикселей X (TextWidth), и для высоты шрифта Canvas значение немного меньше 48 пикселей. Затем я BitBlt () растровое изображение TImage на основной холст. То, что я вижу на экране, это большие тощие буквы, которые ужасно зазубренные. Вместо этого мне нужны толстые гигантские буквы, которые выглядят гладкими. Причина использования комбо TImage / BitBlt заключается в том, что мне нужно сделать изменение размера и альфа-смешивание текста на лету.

Какой самый простой способ получить большие гладкие буквы для печати на моем растровом изображении TImage?

1 Ответ

9 голосов
/ 07 октября 2010

Вы никогда не отображаете 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 +) или Windows XP с включенным ClearType (по какой-то очень странной причине, он по умолчанию отключен), текст должен быть гладким. Просто убедитесь, что вы используете современный шрифт. Большинство из них подойдут, но очень старые шрифты, такие как MS Sans Serif, нельзя сгладить с помощью 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;

Пример вывода текста http://privat.rejbrand.se/sampletext.png
(High-Res)

...