1. #1
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 873
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 873
    Points : 8 079
    Points
    8 079

    Par défaut Comportement différent du TBitmap selon qu'on utilise LoadFromFile ou FillRect / TextOut

    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 : 84
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 ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    novembre 2006
    Messages
    1 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 1 714
    Points : 2 759
    Points
    2 759

    Par défaut

    Bonjour,

    Serait-il possible de voir le code de CombineBitmaps ?
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : mars 2005
    Messages : 2 921
    Points : 7 939
    Points
    7 939

    Par défaut

    Que donne l'affichage dans des TImage de ces Bitmaps ainsi produits ?
    Delphi 5 Pro - Delphi 10.1 Berlin Starter Edition - CodeTyphon 6.15 sous Win 7 et 5.20 sous Ubuntu 14.04
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 873
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 873
    Points : 8 079
    Points
    8 079

    Par défaut

    Citation Envoyé par supersnail Voir le message
    Bonjour,

    Serait-il possible de voir le code de CombineBitmaps ?
    Mais bien sûr :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    function TfrmContrast.CombineBitmaps(aTextBmp, aFondBmp: TBitmap): TBitmap;
    const
      Seuil = 96; // au plus on va vers zéro au plus le texte est pur
      // mais ne pas descendre trop bas non plus, car ça devient moche -- 96 ça a l'air bien
    var
      CT    : pRGBTripleArray;  // Couleur pixel Texte
      CF    : pRGBTripleArray;  // Couleur pixel Fond
      x, y  : integer;
      MaxX, MaxY : integer;
    begin
      //Force les images en 24 bits // vient de Delphi
      // pas sûr qu'en Lazarus/Gtk2 il n'y ait pas des blagues...
      aTextBmp.PixelFormat := pf24bit;
      aFondBmp.PixelFormat := pf24bit;
     
      Result := TBitmap.Create; //Crée l'image résultante
      Result.Assign(aFondBmp); //Assigne l'image de fond à l'image résultante
     
      //Boucle maximum sur les plus petites Largeur/Hauteur
      MaxX := Min(aTextBmp.Width,  aFondBmp.Width);
      MaxY := Min(aTextBmp.Height, aFondBmp.Height);
     
      aTextBmp.BeginUpdate();
      Result.BeginUpdate();
      for y := 0 to MaxY-1 do begin // parcourir les lignes une par une
        CT := pRGBTripleArray(aTextBmp.RawImage.GetLineStart(y));
        CF := pRGBTripleArray(Result.RawImage.GetLineStart(y));
        for x := 0 to MaxX-1 do begin // parcourir les pixels de la ligne en cours, un par un
          // si pixel différent de blanc, remplace fond par texte
          //if ((CT[x].rgbtRed < 255) and (CT[x].rgbtGreen < 255) and (CT[x].rgbtBlue < 255)) then begin
          // ligne dessus ne fonctionne pas bien, celle dessous avec les "or" fonctionne bien, bizarre
          if ((CT[x].rgbtRed   < Seuil)
          or  (CT[x].rgbtGreen < Seuil)
          or  (CT[x].rgbtBlue  < Seuil)) then
          begin
            CF[x].rgbtRed   := CT[x].rgbtRed;
            CF[x].rgbtGreen := CT[x].rgbtGreen;
            CF[x].rgbtBlue  := CT[x].rgbtBlue;
          end;
        end;
      end;
      aTextBmp.EndUpdate();
      Result.EndUpdate();
    end;
    Ce truc vient de cette discussion, un peu adapté : http://www.developpez.net/forums/d66...t-bmp-jpg-png/

    Citation Envoyé par tourlourou Voir le message
    Que donne l'affichage dans des TImage de ces Bitmaps ainsi produits ?
    Que du bon : je ne te donne que le bmp4Text (parce qu'il y a du texte, même s'il est jaune sur blanc donc pas très lisible), le bmp4Fond est un bête rectangle bleu Navy :
    Nom : bmp4Text.png
Affichages : 67
Taille : 2,8 Ko

    EDIT :

    Bon, pour que ça fonctionne, je fais ainsi, avec 2 TMemoryStream :
    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
    var
      MixBmp: TBitmap;
      msF, msT: TMemoryStream;
    begin
      msF:= TMemoryStream.Create;
      msT:= TMemoryStream.Create;
      WriteTextOnBitmap; // travaille avec Bmp4Text
      DrawColorOnBitmap; // travaille avec Bmp4Fond -- fond bleu au lancement
      Bmp4Text.SaveToStream(msT);
      Bmp4Fond.SaveToStream(msF);
      msT.Position:=0; msF.Position:=0;
      Bmp4Text.LoadFromStream(msT, msT.Size);
      Bmp4Fond.LoadFromStream(msF, msF.Size);
      MixBmp := CombineBitmaps(Bmp4Text, Bmp4Fond);
      img4Contrast.Canvas.Draw(0, 0, MixBmp);
    Pourquoi faire simple quand on peut faire compliqué, hein, c'est bien connu
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 256
    Points : 528
    Points
    528

    Par défaut

    Salut, bizarre ton truc on dirait que ton bitmap de sortie est à pixelformat := pf32bits Cela pourrai expliquer ton soucis. Essayes de le forcer à 24bits.
    ou sinon je pensais au padding de fin de ligne des Bitmaps passé en entrés (mais c'est pas ça à mon avis).

    //if ((CT[x].rgbtRed < 255) and (CT[x].rgbtGreen < 255) and (CT[x].rgbtBlue < 255)) then begin
    // ligne dessus ne fonctionne pas bien, celle dessous avec les "or" fonctionne bien, bizarre
    C'est normal avec le Or que cela fonctionne mieux (Example Bleu = R:0, G:0, B:255) avec "And" la condition n'est pas rempli B=255. Avec And il faut que toutes les composantes soient inférieur à 255.
    Avec le Or seulement si une des composante est inferieure à 255.

    BeginUpdate(); EndUpdate; tu peux les virer servent à rien avec scanline ; c'est surtout à utiliser, pour englober les appels aux fonctions de Canvas, si mes souvenirs sont bons

    Essayes ça pour voir. Plus bonus une tchite fonction de mix

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    function ClampByte(const Value: Integer): Byte;
    begin
     if Value > 255 then
       Result := 255
     else
     if Value < 0 then
       Result := 0
     else
       Result := Value;
    end;
     
    function ColorMix(AColor,BColor:TRGBTriple;const Percent : single):TRGBTriple;
    var
      pct:single;
    begin
         pct:=100-Percent;
    //     result.alpha := AColor.alpha;
         result.rgbtRed  := ClampByte(round( ((AColor.rgbtRed/100)  *pct) + ((BColor.rgbtRed/100)  *Percent) ));
         result.rgbtGreen := ClampByte(round( ((AColor.rgbtGreen/100)*pct) + ((BColor.rgbtGreen/100)*Percent) ));
         result.rgbtblue  := ClampByte(round( ((AColor.rgbtblue/100) *pct) + ((BColor.rgbtBlue/100) *Percent) ));
    end;
     
    function TfrmContrast.CombineBitmaps(aTextBmp, aFondBmp: TBitmap): TBitmap;
    const
     SeuilR := 255;
     SeuilG := 255;
     SeuilB := 255;
    var
      CT    : pRGBTripleArray;  // Couleur pixel Texte
      CF, CR    : pRGBTripleArray;  // Couleur pixel Fond
      x, y  : integer;
      MaxX, MaxY : integer;
      TmpBmp : TBitmap;
    begin
     
      aTextBmp.PixelFormat := pf24bit;
      aFondBmp.PixelFormat := pf24bit;
     
      //Boucle maximum sur les plus petites Largeur/Hauteur
      MaxX := Min(aTextBmp.Width,  aFondBmp.Width);
      MaxY := Min(aTextBmp.Height, aFondBmp.Height);
     
      TmpBmp:= TBitmap.Create; //Crée l'image résultante
      TmpBmp.SetSize(MaxX, MaxY);
      tmpBmp.PixelFormat := pf24bits;
     
      for y := 0 to MaxY-1 do begin // parcourir les lignes une par une
        CT := pRGBTripleArray(aTextBmp.RawImage.GetLineStart(y));
        CF := pRGBTripleArray(aFondBmp.RawImage.GetLineStart(y));
        CR := pRGBTripleArray(TmpBmp.RawImage.GetLineStart(y));
        for x := 0 to MaxX-1 do 
        begin      
          if ((CT[x].rgbtRed   = SeuilR)
          and  (CT[x].rgbtGreen = SeuilG)
          and  (CT[x].rgbtBlue  = SeuilB)) then
            CR[X] := CF[X]
         else     
            CR[x] := ColorMix(CF[X], CT[X],100);
        end;
      end;
      Result:= TmpBmp;
    end;
    EDIT : Sinon a la place de
    if ((CT[x].rgbtRed = SeuilR) and (CT[x].rgbtGreen = SeuilG) and (CT[x].rgbtBlue = SeuilB)) then tu pourrais calculer l'intensité moyenne if ((CT[x].rgbtRed+CT[x].rgbtGreen+CT[x].rgbtBlue) div 3) < Seuil then
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  6. #6
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 873
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 873
    Points : 8 079
    Points
    8 079

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Salut, bizarre ton truc on dirait que ton bitmap de sortie est à pixelformat := pf32bits Cela pourrait expliquer ton souci. Essaye de le forcer à 24bits.
    C'est bien ce que je me suis dit aussi. C'est forcé à 24, je l'ai écrit dans le 1er post.

    Citation Envoyé par BeanzMaster Voir le message
    C'est normal avec le Or que cela fonctionne mieux (Example Bleu = R:0, G:0, B:255) avec "And" la condition n'est pas rempli B=255. Avec And il faut que toutes les composantes soient inférieur à 255.
    Avec le Or seulement si une des composante est inferieure à 255.
    Rien compris et pas d'accord ! Je veux virer le blanc autour du texte pour ne recopier que le texte depuis le bitmap "texte" vers le bitmap destination, donc tout ce qui est à 255 ET 255 ET 255 ne doit pas être copié. Et si je le fais avec des and ça fonctionne mal, j'y comprends rien, mais c'est pas grave, il y a plein d'autres choses qui fonctionnent mal sans bonnes raisons...

    Citation Envoyé par BeanzMaster Voir le message
    BeginUpdate(); EndUpdate; tu peux les virer servent à rien avec scanline ; c'est surtout à utiliser, pour englober les appels aux fonctions de Canvas, si mes souvenirs sont bons
    Flemme de faire le test ce soir mais il me semble bien qu'il les faut, c'est une des premières choses que j'ai apprises quand j'ai commencé à jouer avec Scanline.

    Bon, allez, pour ce soir j'en ai marre.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 376
    Points : 8 886
    Points
    8 886

    Par défaut

    Dès le départ ce n'est pas clair, le code du "texte" ne peut pas correspondre à l'image. Bmp4Fond.Height - Bmp4Text.Canvas.TextHeight('Hp')) div 2 est un texte tronqué en hauteur aligné en bas et nullement un texte centré.

  8. #8
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 873
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 873
    Points : 8 079
    Points
    8 079

    Par défaut

    Bonjour à tous,

    Citation Envoyé par Andnotor Voir le message
    Dès le départ ce n'est pas clair, le code du "texte" ne peut pas correspondre à l'image. Bmp4Fond.Height - Bmp4Text.Canvas.TextHeight('Hp')) div 2 est un texte tronqué en hauteur aligné en bas et nullement un texte centré.
    Et pourtant...
    L'image ci-dessous (celle de gauche [celle de droite aussi, mais elle, elle est là pour nous montrer le bug contourné avec les TMemoryStreams]) a été générée à partir de cette formule...
    Nom : compar_bmps2.png
Affichages : 57
Taille : 3,5 Ko

    EDIT : ta déduction vient peut-être du fait que j'ai oublié de préciser que les deux bitmaps de travail (Bmp4Fond et Bmt4Text) ont la même taille.

    Non, ce qui m'ennuie surtout dans la procédure CombineBitmaps, c'est que la précision mathématique des calculs fait sauter l'anti-aliasing et du coup je me retrouve avec des abominations, selon les couleurs :
    Nom : bleu_sur_bleu.png
Affichages : 57
Taille : 3,8 Ko

    En haut, le jaune remplacé par du bleu, et la copie d'écran est zoomée à 200 % ; en bas c'est le fichier généré par le bitmap Bmp4Text et zoomé à 800 % pour bien voir l'anti-aliasing.

    Et ça, je ne vois vraiment pas comment le gérer, à moins de tout repenser, de virer cette proc de combinaison et d'envisager d'utiliser un TPanel bidouillé (car utiliser un TPanel avec son fond d'une couleur et son texte d'une autre ne présente pas le problème d'aliasing (copie d'écran zoomée à 200 %) :
    Nom : ton_sur_ton.png
Affichages : 57
Taille : 1,9 Ko
    -- Le souci c'est que la position du caption devient fixe dans ce cas, et ça m'ennuie, alors qu'avec un TBitmap indépendant et un TTrackbar, je peux mettre le texte où je veux en hauteur, malgré ce qu'en pense Andnotor )

    EDIT2 :
    Maintenant, si quelqu'un sait comment faire du TextOut directement sur un TImage tout en supprimant le fond du rectangle du texte pour ne garder que les lettres, ça m'intéresse ; perso je n'y suis pas arrivé, ou bien le fond est blanc, ou bien il est noir, dans un cas comme dans l'autre c'est très moche .

    Ça va, je crois que j'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var
      ARect: TRect;
      TS: TTextStyle;
    begin
      ARect := GraphicsForm.ClientRect;
      with Canvas do
        begin
          //Blue text
          font.Color := clBlue;
          font.Size := 10;
     
          TS := TextStyle;
          TS.Opaque := False;
          TextRect(ARect, 250, 550, 'texte de test avec jambages', TS);
    Nom : textrect.png
Affichages : 56
Taille : 7,5 Ko

    Allez, cette belle image zoomée à 400 % me remonte le moral
    Bon dimanche !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    avril 2002
    Messages
    2 410
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : avril 2002
    Messages : 2 410
    Points : 4 087
    Points
    4 087

    Par défaut

    Citation Envoyé par Jipété Voir le message

    Maintenant, si quelqu'un sait comment faire du TextOut directement sur un TImage tout en supprimant le fond du rectangle du texte pour ne garder que les lettres, ça m'intéresse ; perso je n'y suis pas arrivé, ou bien le fond est blanc, ou bien il est noir, dans un cas comme dans l'autre c'est très moche .
    Avec Delphi, il suffit de mettre la propriété Style de Canvas.Brush à bsClear.
    A tester si cela a été reproduit avec Lazarus 😜
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  10. #10
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 873
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 873
    Points : 8 079
    Points
    8 079

    Par défaut

    Citation Envoyé par M.Dlb Voir le message
    Avec Delphi, il suffit de mettre la propriété Style de Canvas.Brush à bsClear.
    A tester si cela a été reproduit avec Lazarus 😜
    Ah ben vi, ça fonctionne aussi tout en restant avec TextOut !
    Faut dire que j'étais parti d'un projet de démo (trouvé Dieu seul sait où là : http://www.pp4s.co.uk/main/tu-form-paintbox.html), maintenant, si la démo ne montre pas toutes les possibilités, je n'ai pas eu l'idée de fouiller plus profondément...

    Merci à toi
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 256
    Points : 528
    Points
    528

    Par défaut

    Salut je viens de faire un petit test c'est la cata Le TBitmap est vraiment pourri

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
     
    Unit Unit1;
     
    {$mode objfpc}{$H+}
     
    Interface
     
    Uses
      Classes, Sysutils, Fileutil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, ComCtrls,
      LCLType, Math;
     
    Type
     
      { Tform1 }
     
      Tform1 = Class(Tform)
        edtText : Tedit;
        Label1 : Tlabel;
        Label2 : Tlabel;
        pnlView : Tpanel;
        tbPosY : Ttrackbar;
        tbColorMix : Ttrackbar;
        Procedure Formcreate(Sender : Tobject);
        Procedure Formshow(Sender : Tobject);
        Procedure Tbposychange(Sender : Tobject);
      Private
     
      Public
        BmpText, BmpFond, BmpOut : TBitmap;
     
        procedure UpdateView;
        procedure DoDrawTheText;
      End;
     
    type
      TRGBTripleArray = array[0..32767] of TRGBTriple;
      PRGBTripleArray = ^TRGBTripleArray;
     
    Var
      Form1 : Tform1;
     
    Implementation
     
    {$R *.lfm}
     
    { Tform1 }
     
    Procedure Tform1.Formcreate(Sender : Tobject);
     
    Begin
      BmpFond := TBitmap.Create;
      BmpFond.SetSize(400,128);
      BmpFond.PixelFormat := pf24Bit;
      With BmpFond.Canvas do
      begin
        Brush.Style := bsSolid;
        Brush.Color := clBlue;
        FillRect(0,0,400,128);
      End;
     
      BmpText := TBitmap.Create;
      BmpText.SetSize(400,128);
      BmpText.PixelFormat := pf24Bit;
     
      BmpOut := TBitmap.Create;
      BmpOut.SetSize(400,128);
      BmpOut.PixelFormat := pf24Bit;
     
    End;
     
    Procedure Tform1.Formshow(Sender : Tobject);
    Begin
      UpdateView;
    End;
     
    Procedure Tform1.Tbposychange(Sender : Tobject);
    Begin
      UpdateView;
    End;
     
    procedure TForm1.DoDrawTheText;
    Var
      aTextStyle : TTextStyle;
    begin
     BmpText.BeginUpdate(True);
     With BmpText.Canvas do
     begin
       Clear;
       Brush.Style := bsSolid;
       Brush.Color := clWhite;
       FillRect(0,0,400,128);
     
       Font.Color  := clYellow;
       With aTextStyle do
       begin
         Alignment :=  taCenter;
         Layout :=tlTop;
         SingleLine := False;
         WordBreak := True;
         Opaque := True;
         RightToLeft := False;
         SystemFont := True;
         EndEllipsis := True;
       End;
       Brush.Style := bsClear;
       Brush.Color := clNone;
       TextRect(Rect(4,0,396,120),4,tbPosY.Position,edtText.Text,aTextStyle);
     End;
     BmpText.EndUpdate();
    end;
     
    Procedure Tform1.Updateview;
    const
     Seuil = 85; // = 255 div 3
    var
      CT    : pRGBTripleArray;  // Couleur pixel Texte
      CF, CR    : pRGBTripleArray;  // Couleur pixel Fond
      x, y  : integer;
      MaxX, MaxY : integer;
     
      function ColorMix(AColor,BColor:TRGBTriple;const Percent : single):TRGBTriple;
      var
        pct:single;
     
        function ClampByte(const Value: Integer): Byte;
        begin
         if Value > 255 then
           Result := 255
         else
         if Value < 0 then
           Result := 0
         else
           Result := Value;
        end;
     
      begin
        pct:=100-Percent;
        result.rgbtRed  := ClampByte(round( ((AColor.rgbtRed/100)  *pct) + ((BColor.rgbtRed/100)  *Percent) ));
        result.rgbtGreen := ClampByte(round( ((AColor.rgbtGreen/100)*pct) + ((BColor.rgbtGreen/100)*Percent) ));
        result.rgbtblue  := ClampByte(round( ((AColor.rgbtblue/100) *pct) + ((BColor.rgbtBlue/100) *Percent) ));
      end;
    Begin
     
     //Boucle maximum sur les plus petites Largeur/Hauteur
     MaxX := Min(BmpText.Width,  BmpFond.Width);
     MaxY := Min(BmpText.Height, BmpFond.Height);
     
     DoDrawTheText;
     //BmpOut.SetSize(400,128);
     
     for y := 0 to MaxY-1 do
     begin // parcourir les lignes une par une
       CT := pRGBTripleArray(BmpText.RawImage.GetLineStart(y));
       CF := pRGBTripleArray(BmpFond.RawImage.GetLineStart(y));
       CR := pRGBTripleArray(BmpOut.RawImage.GetLineStart(y));
       for x := 0 to MaxX-1 do
       begin
         if (((CT^[x].rgbtRed +CT^[x].rgbtGreen+CT^[x].rgbtBlue) div 3) < Seuil) then
           CR^[X] := CF^[X]
        else
           CR^[x] := ColorMix(CF^[X], CT^[X],tbColorMix.Position);
       end;
     end;
     pnlView.Canvas.Clear;
     pnlView.Canvas.Draw(0,0,BmpText);    // ------> Avec BmpOut le texte est toujours au milieu !!!!!!!!!
     Application.ProcessMessages;
    End;
    Regardes la procedure DoDrawText je pense c'est ce que tu recherche
    mais cela fonctionne qu'avec pnlView.Canvas.Draw(0,0,BmpText); ------> Avec BmpOut le texte est toujours au milieu !!!!!!!!! c'est incompréhensible.C'est comme si la boucle "for y := 0 to MaxY-1 do" faisait ce quelle veux.

    Bref je continue vraiment a penser qu'il faut mieux passer par TLazIntImg (http://wiki.freepascal.org/Developin...d_on_the_width)
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  12. #12
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 873
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 873
    Points : 8 079
    Points
    8 079

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Salut je viens de faire un petit test c'est la cata Le TBitmap est vraiment pourri
    Hopopop !
    Tu as un train de retard, ou tu as raté une marche, je ne sais pas trop, mais moi je m'envole avec la combine à M.Dlb et son Brush.Style := bsClear; !

    Que du bonheur, et avec un TrackBar et une bête règle de 3, je place mon texte où je veux en hauteur sans plus utiliser CombineBitmaps ni les TMemoryStreams, et plus de problèmes de Scanline,

    Relis mes deux derniers posts...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    novembre 2006
    Messages
    1 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 1 714
    Points : 2 759
    Points
    2 759

    Par défaut

    Bonjour,

    Visiblement (merci le debugger) sous le widgetset GTK2, l'image RAW est remplie en 32 bits quoi qu'il arrive par la bibliothèque de dessin GDK (utilisé en backend de TCanvas), même si le BitDepth soit spécifié à 24bits. Néanmoins dans le TRawImage, la propriété Description.Format passe à ricfRGBA, et Description.BitsPerPixels est mise à 32...

    Visiblement aucun code de conversion de bitdepth n'est prévu par Lazarus pour éliminer les octets en trop (mais on devrait pouvoir néanmoins pouvoir utiliser ces valeurs pour effectuer la conversion à la main si besoin, si on veut se paser des TMemoryStream). Bref encore les joies de GTK

    Apparament le problème est aussi mentionné ici: https://forum.lazarus.freepascal.org...ic,7771.0.html

    EDIT: j'avais pas encore vu la solution du bsClear, ça m'apprendra à ne pas F5 la page du thread
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 376
    Points : 8 886
    Points
    8 886

    Par défaut

    Citation Envoyé par Jipété Voir le message
    EDIT : ta déduction vient peut-être du fait que j'ai oublié de préciser que les deux bitmaps de travail (Bmp4Fond et Bmt4Text) ont la même taille.
    Ce n'est pas une déduction, la priorité des opérations fait que ta formule est interprétée comme suit : Height -(TextHeight /2), tu soustraits une demi hauteur de texte à la hauteur du bitmap

    Pour la combinaison de deux images, on en avait déjà longuement débattu. Après, s'il s'agit juste d'écrire sur une image...

  15. #15
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 873
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 873
    Points : 8 079
    Points
    8 079

    Par défaut

    Citation Envoyé par Andnotor Voir le message
    Ce n'est pas une déduction, la priorité des opérations fait que ta formule est interprétée comme suit : Height -(TextHeight /2), tu soustraits une demi hauteur de texte à la hauteur du bitmap
    J'ai compris ton malaise : c'est parce que tu as loupé la première parenthèse (ouvrante) :
    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        (Bmp4Fond.Height - Bmp4Text.Canvas.TextHeight('Hp')) div 2, // au milieu
    Parce que ce matin, quand j'ai parlé de ta déduction, je suis avant revenu ici et ai copié/collé cette ligne ci-dessus (extraite du tout premier post, 4e code en bas) pour la mettre à la place de ma règle de 3 et j'ai bien vu que je tombais juste.

    On fatigue, on fatigue...

    Et pourquoi une règle de 3 ? Pour prendre en compte la hauteur du curseur du Trackbar, qui fait quand il est en haut le texte va être trop haut et quand il est en bas, le texte va être trop bas.
    D'où un poil d'ajustements,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 376
    Points : 8 886
    Points
    8 886

    Par défaut

    Oups ! Effectivement !

    Vais plus posté à 3h30 du mat' moi

  17. #17
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 256
    Points : 528
    Points
    528

    Par défaut

    En fait le dernier message que j'ai vu c'est ton post de 9h01 mais sans l'EDIT Puis j'ai vaqué a mes occupations, je n'ai pas rafraichie la page du navigateur et j'ai posté.
    Bref ton idée de départ était bonne du coup voila ce que je viens de pondre pour le fun

    Nom : 2017-09-10_141153.jpg
Affichages : 48
Taille : 17,8 Ko

    et le zip qui va avec : TestColorMix.zip

    Et pour le begin et EndUpdate c'est obligatoire avec les scanline pour que les changements soyent pris en compte
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  18. #18
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 873
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 873
    Points : 8 079
    Points
    8 079

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Et pour le begin et EndUpdate c'est obligatoire avec les scanline pour que les changements soyent pris en compte
    Ah !
    Je ne m'étais pas trompé !

    Sinon, lol !, je veux pas dire, mais y a encore du boulot, hein ! Déjà à l'ouverture du .lpi je gagne cette horreur :
    Nom : erreur_panel.png
Affichages : 48
Taille : 10,7 Ko

    Bon, je m'en suis sorti en rattachant l'événement OnFormPaint à ton PnlviewPaint et ça fonctionne, mais tellement mal que je n'ose pas montrer la copie d'écran

    Et pourtant il faut bien, sinon rien ne va avancer, alors bon, on plonge, tant pis si elle est froide :
    Nom : form_beanz.png
Affichages : 66
Taille : 12,9 Ko

    Dur dur, hein !
    Je ne chercherai pas le pourquoi du comment puisque j'ai bien écrit que je n'utilisais plus de mix de bmp, pi j'ai pas le temps, pi des fois je te (vous) signale des choses mais on dirait que ça sert à rien :
    on met d'abord le PixelFormat et ensuite les tailles, sinon ça rajoute des actions inutiles, et on n'utilise plus le SetSize (hé oui, c'était joli, mais suis le code avec Ctrl-clic, tu verras...)
    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
    17
    18
    19
    20
    21
    22
    23
    24
    Procedure Tform1.Formcreate(Sender : Tobject);
    Begin
      BmpFond := TBitmap.Create;
      BmpFond.PixelFormat := pf24Bit;
    //  BmpFond.SetSize(400,128);
      BmpFond.Width:=400; BmpFond.Height:=128;
     
      With BmpFond.Canvas do
      begin
        Brush.Style := bsSolid;
        Brush.Color := clBlue;
        FillRect(0,0,400,128);
      End;
     
      BmpText := TBitmap.Create;
      BmpText.PixelFormat := pf24Bit;
    //  BmpText.SetSize(400,128);
      BmpText.Width:=400; BmpText.Height:=128;
     
      BmpOut := TBitmap.Create;
      BmpOut.PixelFormat := pf24Bit;
    //  BmpOut.SetSize(400,128);
      BmpOut.Width:=400; BmpOut.Height:=128;
    End;
    OK, c'est pas ça qui va corriger les problèmes de la fiche, mais c'est manière de dire...

    Et ça c'est pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       TextRect(Rect(4,0,396,128), 4, tbPosY.Position, edtText.Text, aTextStyle);
    Si on pousse le curseur à fond à droite, le texte disparaît ! Faut faire une règle de 3, j'en ai d'ailleurs commencé une mais j'ai un bug : en cas de grande taille de texte, ça n'est pas aussi précis qu'avec une petite taille.
    Je cherche...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  19. #19
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 873
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 873
    Points : 8 079
    Points
    8 079

    Par défaut

    Citation Envoyé par Jipété Voir le message
    Si on pousse le curseur à fond à droite, le texte disparaît ! Faut faire une règle de 3, j'en ai d'ailleurs commencé une mais j'ai un bug : en cas de grande taille de texte, ça n'est pas aussi précis qu'avec une petite taille.
    Je cherche...
    Dans mon projet c'est si je tire le curseur tout en bas que le texte disparaît (descend trop bas).

    Et pourtant les calculs sont justes... C'est juste une histoire de non-propagation du changement de la taille de la police au canvas de l'image.

    Mais si je reclique sur le bouton appelant la boîte de dialogue, sans rien changer, je clique OK et là ça se propage enfin et j'ai donc le comportement que j'attends.
    Est-il normal qu'il me faille agir ainsi ? Cliquer deux fois sur le bouton pour que tout soit pris en compte !? Je ne sais pas gérer ce genre de sac de nœuds...

    Regardez (image réduite de moitié) : en haut après changement de taille de la police, en bas après avoir rappelé la boîte de dialogue sans avoir rien changé, juste cliqué sur OK : repérez la remontée du texte par rapport au curseur qui n'a pas été touché ni à la souris ni au clavier ni par code.
    Nom : pb_fdlg.png
Affichages : 47
Taille : 7,4 Ko

    Je ne comprends pas, et je ne sais pas quoi faire. J'ai même essayé de séparer (avec un timer -- je sais faire, maintenant) la procédure de changement de font depuis son bouton et la mise à jour des données d'affichage, mais non...

    PS : le bug fonctionne également dans l'autre sens : une fois la police agrandie et correctement mise en place par deux clics donc, si je veux la réduire il me (lui !) faudra deux clics aussi.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  20. #20
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 256
    Points : 528
    Points
    528

    Par défaut

    Sinon, lol !, je veux pas dire, mais y a encore du boulot, hein ! Déjà à l'ouverture du .lpi je gagne cette horreur :
    Ca ca ne viens pas de moi mais de L'IDE (Je l'ai fais en 1.8RC4 64bit) Tu as utilisé quelle version ?? La 1.4 ?

    Ce qui est quand même navrant c'est que cela fonctionne bien chez moi sous W10.

    on n'utilise plus le SetSize (hé oui, c'était joli, mais suis le code avec Ctrl-clic, tu verras...)
    Oui j'arrive a
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    TCustomBitmap = class(TRasterImage) 
    public
      procedure SetSize(AWidth, AHeight: integer); override; 
     
     
    procedure TCustomBitmap.SetSize(AWidth, AHeight: integer);
    var
      SCB: TSharedCustomBitmap;
      CurIntfImage, NewIntfImage: TLazIntfImage;
      NewRawImage: TRawImage;
    begin
      RawImageNeeded(True);
     
      if AWidth < 0 then AWidth := 0;
      if AHeight < 0 then AHeight := 0;
     
      SCB := TSharedCustomBitmap(FSharedImage);
      if  (SCB.FImage.Description.Height = cardinal(AHeight))
      and (SCB.FImage.Description.Width = cardinal(AWidth))
      then Exit;
     
      UnshareImage(False);
      // FSHaredImage might have been changed by UnshareImage
      SCB := TSharedCustomBitmap(FSharedImage);
     
      // for delphi compatibility copy old image
      RawImageNeeded(False);
      if  (SCB.FImage.Description.Height >= cardinal(AHeight))
      and (SCB.FImage.Description.Width >= cardinal(AWidth))
      then begin
        // use the faster ExtractRect. Since it calculates the intersection of source
        // and requested rect we can only use it when shrinking the image.
        SCB.FImage.ExtractRect(Rect(0, 0, AWidth, AHeight), NewRawImage);
      end
      else begin
        // use slow copy of pixeldata till rawimage can also copy to larger destination
     
        NewRawImage.Description := SCB.FImage.Description;
        NewRawImage.Description.Width := AWidth;
        NewRawImage.Description.Height := AHeight;
        NewRawImage.ReleaseData;
     
        if SCB.FImage.DataSize > 0 then
        begin
          NewRawImage.CreateData(True);
          CurIntfImage := TLazIntfImage.Create(SCB.FImage, False);
          NewIntfImage := TLazIntfImage.Create(NewRawImage, False);
          NewIntfImage.CopyPixels(CurIntfImage);
          CurIntfImage.Free;
          NewIntfImage.Free;
        end;
      end;
     
      SCB.FImage.FreeData;
      SCB.FImage := NewRawImage;
      // size was changed => update HDC and HBITMAP
      FreeCanvasContext;
      SCB.FreeHandle;
      FreeMaskHandle;
      Changed(Self);
    end;
    et Alors ???? je comprend pas bien ce que tu veux dire

    Et ça c'est pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextRect(Rect(4,0,396,128), 4, tbPosY.Position, edtText.Text, aTextStyle);
    Si on pousse le curseur à fond à droite, le texte disparaît ! Faut faire une règle de 3, j'en ai d'ailleurs commencé une mais j'ai un bug : en cas de grande taille de texte, ça n'est pas aussi précis qu'avec une petite taille.
    Je cherche...
    En quoi c'est pas bon ? C'est normal que le texte disparaisse le Bmp a une hauteur de 128 si tbPosY.Position = 128, le texte n'est pas dessiner. Il faudrait borner : 128-TextHeight('H') pour qu'il ne sorte pas.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. SimUnlockPhone comportement différent selon les téléphones
    Par bobby51 dans le forum Windows Mobile
    Réponses: 0
    Dernier message: 29/04/2011, 10h43
  2. Comportement différent de cos() selon contexte de l'appel
    Par dreydrey dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 10/01/2011, 17h01
  3. Réponses: 7
    Dernier message: 15/02/2010, 21h52
  4. Comportement différent selon le lanceur
    Par michelcky dans le forum GTK+
    Réponses: 1
    Dernier message: 03/10/2008, 19h03
  5. Comportement différent selon Mode Execution
    Par MarronSuisse dans le forum C
    Réponses: 7
    Dernier message: 14/04/2008, 12h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo