2010-10-07 9 views
4

J'ai un composant TImage que j'imprime une chaîne de texte à l'aide de TCanvas.TextOut(). J'ai défini la hauteur et la largeur de la TImage à une taille importante de 50 pixels X (TextWidth) pixels, et définir la hauteur de la police Canvas à quelque chose d'un peu plus petit comme 48 pixels. J'ai ensuite BitBlt() le bitmap de TImage sur le Canvas principal. Ce que je vois sur l'écran, ce sont de grosses lettres maigres qui sont terriblement déchiquetées. Ce que je veux à la place, ce sont d'épaisses lettres jumbo qui semblent lisses. La raison de l'utilisation du combo TImage/BitBlt est que j'ai besoin de redimensionner et de fusionner le texte à la volée.Delphi 6: Comment afficher du texte de grande qualité de grande taille via la méthode TextOut()?

Quelle est la façon la plus simple d'imprimer de grandes lettres lisses sur mon bitmap TImage?

+0

Quelle police utilisez-vous? Pouvez-vous poster une photo pour montrer ce que vous considérez comme "terriblement déchiqueté"? –

+0

Bonjour Rob. La police était en effet le problème principal. Voir mon commentaire en réponse à Andreas answer pour plus de détails. –

Répondre

9

N'avez-vous jamais affiché le TImage? Ensuite, vous devriez vraiment utiliser un bitmap hors écran à la place. C'est une technique très courante pour réaliser un double tampon (rendu sans scintillement).

Par exemple,

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; 

Si vous utilisez une version moderne de Windows (par exemple Vista +), ou Windows XP avec ClearType activé (pour une raison très étrange, il est désactivé par défaut), le texte doit être lisse. Assurez-vous simplement que vous utilisez une police moderne. La plupart d'entre eux le feront, mais de très vieilles polices comme MS Sans Serif ne peuvent pas être lissées en utilisant ClearType.

De même, naturellement, il est impératif que bm ait la même couleur de fond que le formulaire, car le mélange alpha se produira lorsque le texte est dessiné sur bm. Donc, si la forme est clRed (pour une raison perverse), vous devez faire

bm.Canvas.Brush.Color := clRed; 
bm.Canvas.Brush.Style := bsSolid; 
bm.FillRect(Rect(0, 0, bmWidth, bmHeight)); 

avant

bm.TextOut(...) 

Juste pour que nous parlons de la même chose: est-ce pas assez lisse?

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

Bonjour Andreas. Il s'est avéré que la plupart du problème était dû à mon choix de police. Le choix par défaut de Delphi 6 ne correspond pas bien à ce que vous avez indiqué. Suite à votre suggestion, j'ai essayé certains des plus récents et la plupart du problème est parti. Je crois que les derniers jaggies que je vois sont dus à mon utilisation de AlphaBlend() pour redimensionner l'image texte en transit, plutôt que de réimprimer l'image texte à chaque fois en utilisant des valeurs de hauteur (pixel) variables, une optimisation de vitesse inutile. Merci pour l'astuce à propos de ClearType. Je vais jeter un coup d'oeil à ça. –

Questions connexes