2010-10-07 4 views
4

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

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

+0

Какой шрифт вы используете? Можете ли вы опубликовать фотографию, чтобы продемонстрировать, что вы считаете «ужасно зубчатым»? –

+0

Hello Rob. Шрифт действительно был главной проблемой. См. Мой комментарий в ответ на ответ Андреаса для более подробной информации. –

ответ

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 +) или 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; 

Sample Text Output http://privat.rejbrand.se/sampletext.png
(High-Res)

+0

Привет, Андреас. Оказалось, что большая часть проблемы связана с моим выбором шрифта. Выбор по умолчанию Delphi 6 не очень хорошо масштабируется, как вы указали. Следуя вашему предложению, я попробовал некоторые из новых, и большая часть проблемы исчезла. Я считаю, что оставшиеся jaggies, которые я вижу, объясняются тем, что я использовал AlphaBlend() для изменения размера изображения Text в пути, вместо того, чтобы перепечатывать текстовое изображение каждый раз, используя разные значения высоты (пикселя), оптимизацию скорости, которая может не понадобиться. Спасибо за отзыв о ClearType. Я посмотрю на это. –

Смежные вопросы