Bonsoir,
Y avait longtemps...
J'ai cru devenir fou cet aprème : une petite fonction qui mixe deux fichiers bitmap en un seul, qui fonctionne très bien en test et qui se vautre complètement une fois copiée/collée dans un gros projet, sans lui changer une virgule !
Des heures que je suis dessus...
- En test j'ouvre deux fichiers bitmap avec LoadFromFile, et je les passe à la fonction, le résultat est impec, il n'y a vraiment rien à dire.
- En prod je remplis mes deux bitmaps par code (voir + bas), l'un avec une couleur unie, l'autre avec du texte et je me retrouve avec les traits verticaux caractéristiques des problèmes de scanline (oui, la fonction l'utilise pour combiner les deux bitmaps).
Ça c'est parfait :
Et ça c'est la cata :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Bmp4Text.LoadFromFile(PChar(ExtractFilePath(Application.ExeName)) + 'Text.bmp'); Bmp4Fond.LoadFromFile(PChar(ExtractFilePath(Application.ExeName)) + 'Fond.bmp'); //WriteTextOnBitmap; // travaille avec Bmp4Text //DrawColorOnBitmap; // travaille avec Bmp4Fond -- fond bleu au lancement MixBmp := CombineBitmaps(Bmp4Text, Bmp4Fond); img4Affichage.Canvas.Draw(0, 0, MixBmp);
Résultats (image réduite de moitié) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 //Bmp4Text.LoadFromFile(PChar(ExtractFilePath(Application.ExeName)) + 'Text.bmp'); //Bmp4Fond.LoadFromFile(PChar(ExtractFilePath(Application.ExeName)) + 'Fond.bmp'); WriteTextOnBitmap; // travaille avec Bmp4Text DrawColorOnBitmap; // travaille avec Bmp4Fond -- fond bleu au lancement MixBmp := CombineBitmaps(Bmp4Text, Bmp4Fond); img4Affichage.Canvas.Draw(0, 0, MixBmp);
Je précise à tout hasard que la création des 2 bitmaps inclut la séquence PixelFormat := pf24bit;, et que Width et Height sont forcés aux valeurs du TImage d'affichage.
Le remplissage des bitmaps :
pour la couleur unie :
C'est tout ! Et pour le texte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 with Bmp4Fond.Canvas do begin Brush.Color := DirectColor; // un truc à moi, qui peut varier FillRect(ClipRect); end;
Comment me sortir de ce pétrin à part en enregistrant WriteText et DrawColor pour ensuite les recharger ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Bmp4Text.Height := Bmp4Fond.Height; Bmp4Text.Width := Bmp4Fond.Width; with Bmp4Text.Canvas do begin Brush.Color := clWhite; // fond blanc FillRect(ClipRect); with Font do begin Name := FontName; Size := FontSize; Style := FontStyle; Color := AlternColor; // un truc à moi, qui peut varier end; end; with Bmp4Text.Canvas do TextOut( 10, // pas complètement collé à gauche (Bmp4Fond.Height - Bmp4Text.Canvas.TextHeight('Hp')) div 2, // au milieu ledSaisieTexte4Contrast.Text);
Partager