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 :
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);
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é) :
Nom : compar_bmps2.png
Affichages : 347
Taille : 3,5 Ko

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 :
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;
C'est tout ! Et pour le texte :
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);
Comment me sortir de ce pétrin à part en enregistrant WriteText et DrawColor pour ensuite les recharger ?