Drawtext and co.... [Résolu]

slhuilli
Messages postés
193
Date d'inscription
lundi 7 janvier 2002
Dernière intervention
7 juillet 2017
- 13 févr. 2007 à 22:09 - Dernière réponse : ThWilliam
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
- 16 févr. 2007 à 11:27
Bonjour,

je cherche a faire deux choses précises sosu delphi 6 :

1. sur une image JPG ou BMP, superpositionner une autre image plus petite
2. sur une image JPG ou BMP, superpositionner un text

je l'ai deja fait mais je ne retrouve plus comment. C'est faisable mais comment.....

Merci de votre aide
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
ThWilliam
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
- 15 févr. 2007 à 14:12
3
Merci
Salut,

Voici un exemple d'écriture de texte sur plusieurs lignes et centré dans le bitmap.

procedure InsertText(Bmp: TBitmap; Text: string; TextW: integer);
var
  R: TRect;
  BW, BH: integer;
begin
  with Bmp.Canvas do
  begin
    Font.Color:= clred;
    Font.Size:= 18;
    Font.Style:= [fsBold];
    Brush.Style:= bsClear; // pour écrire en transparent
  end;
  BW:= Bmp.Width;
  BH:= Bmp.Height;
  // initialisation du TRect
  R.Left:= 0;
  R.Top:= 0;
  R.Right:= TextW; // largeur du texte souhaitée
  R.Bottom:= BH;
  // 1° appel à DrawText pour modifier R en fonction du texte
  DrawText(Bmp.Canvas.Handle, PChar(Text), -1, R,
                        DT_CENTER or DT_WORDBREAK or DT_CALCRECT);
  // réajustement de R pour le placer au centre de l'image
  R.Left:= (BW - R.Right) div 2;
  R.Right:= R.Right + R.Left;
  R.Top:= (BH - R.Bottom) div 2;
  R.Bottom:= R.Bottom + R.Top;
  // 2° appel pour écrire
  DrawText(Bmp.Canvas.Handle, PChar(Text), -1, R,
                        DT_CENTER or DT_WORDBREAK);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
   InsertText(Image1.Picture.Bitmap, 'Voici un petit texte', 150);
   Image1.Invalidate; // nécessaire dans ce cas
end;

A +
Thierry

Merci ThWilliam 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de ThWilliam
Meilleure réponse
slhuilli
Messages postés
193
Date d'inscription
lundi 7 janvier 2002
Dernière intervention
7 juillet 2017
- 15 févr. 2007 à 21:45
3
Merci
je suppose que ca marche .... mais pas chez moi, mon image n'a rien d'écrit

Merci slhuilli 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de slhuilli
f0xi
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
- 14 févr. 2007 à 01:37
0
Merci
on peu faire par exemple (en travaillant qu'en bitmap) :

procedure SupperposeBitmap(BmpDest, BmpArrierePlan, BmpAvantPlan : TBitmap; const OffsetX, OffsetY : integer);
begin
   if BmpDest.HBITMAP <> BmpArrierePlan.HBITMAP then
      BmpDest.Assign(BmpArrierePlan);
   BmpDest.Canvas.Draw(OffsetX, OffsetY, BmpAvantPlan);
end;

procedure IncrustText(BmpDest, BmpSrc : TBitmap; const Text : string; const OffsetX,OffsetY : integer);
begin
   if BmpDest.HBITMAP <> BmpSrc.HBITMAP then
      BmpDest.Assign(BmpSrc);
   BmpDest.Canvas.TextOut(OffsetX,OffsetY, Text); 
end;

aprés on peu ajouter des parametres comme la police a utiliser etc
.
<hr size="2" width="100%" />Croc (click me)
Commenter la réponse de f0xi
ThWilliam
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
- 14 févr. 2007 à 10:29
0
Merci
Salut,

Pour l'écriture de texte, outre TextOut et TextRect, tu as la routine windows DrawText qui, bien qu'un peu plus lente, est nettement plus performante.
DrawText permet facilement de gérer l'alignement ou l'écriture sur plusieurs lignes.
Exemple : alignement centré et sur plusieurs lignes à l'intérieur d'un TRect que tu délimites préalablement :
DrawText(BmpDest.Canvas.Handle, Pchar(Text), -1, R, DT_CENTER or DT_WORDBREAK);

DrawText a aussi un truc très intéressant : si tu utilises le paramètre DT_CALCRECT :

DrawText(BmpDest.Canvas.Handle, PChar(Text), -1, R, DT_CALCRECT or DT_WORDBREAK); 

 la procedure n'écrira rien mais modifiera R (ton TRect) pour qu'il contienne tout le texte. Ce qui te permet, avant un deuxième appel à DrawText de remodifier la position R.Left et R.Top pour placer précisément le texte sur le canvas.

A +
Thierry
Commenter la réponse de ThWilliam
slhuilli
Messages postés
193
Date d'inscription
lundi 7 janvier 2002
Dernière intervention
7 juillet 2017
- 14 févr. 2007 à 22:40
0
Merci
Merci a vous mais je n'arrive toujours pas a faire ce que je veux faire.....
Si vous aviez une routine ou fonction toute faite....
Commenter la réponse de slhuilli
ThWilliam
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
- 16 févr. 2007 à 11:27
0
Merci
N'as-tu pas oublié d'assigner un bitmap à la propriété Picture de Image1 ?Si tu ne l'as pas fait, ça ne peut pas marcher puisque la procedure écrit sur le Canvas du Bitmap (qui a Width 0 et Height 0 !!!).
Un conseil pour bien tester : chosis un fichier .bmp d'au moins 300/300 pixels.
Commenter la réponse de ThWilliam

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.