IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Trouver la couleur qui convient le mieux pour un texte


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut Trouver la couleur qui convient le mieux pour un texte
    Bonjour

    Presque tout est dans le titre comment, en fonction d'un fond en couleur trouver la meilleure couleur du texte (blanc ou noir) ?
    Il doit certainement y avoir une réponse simple mais, moi et les couleurs ....

    j'ai bien fait ce petit test
    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
    unit UnitColorFont;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      Data.Bind.EngExt, Fmx.Bind.DBEngExt, System.Rtti, System.Bindings.Outputs,
      Fmx.Bind.Editors, Data.Bind.Components, FMX.Colors, FMX.Objects,
      FMX.Controls.Presentation, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo;
     
    type
      TForm64 = class(TForm)
        RectangleTest: TRectangle;
        TextTest: TText;
        ComboColorBox1: TComboColorBox;
        BindingsList1: TBindingsList;
        LinkControlToPropertyFillColor: TLinkControlToProperty;
        procedure ComboColorBox1Change(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form64: TForm64;
     
    implementation
     
    {$R *.fmx}
     
    procedure TForm64.ComboColorBox1Change(Sender: TObject);
    var C : TAlphaColorRec;
    begin
      C:= TAlphaColorRec(RectangleTest.Fill.Color);
      if (C.R + C.G + C.B) > 384
       then TextTest.TextSettings.FontColor:=TAlphaColorRec.Black
       else TextTest.TextSettings.FontColor:=TAlphaColorRec.White;
    end;
     
    end.
    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
    object Form64: TForm64
      Left = 0
      Top = 0
      Caption = 'Form64'
      ClientHeight = 197
      ClientWidth = 525
      FormFactor.Width = 320
      FormFactor.Height = 480
      FormFactor.Devices = [Desktop]
      DesignerMasterStyle = 0
      object RectangleTest: TRectangle
        Fill.Color = claWhite
        Position.X = 17.000000000000000000
        Position.Y = 61.000000000000000000
        Size.Width = 256.000000000000000000
        Size.Height = 25.000000000000000000
        Size.PlatformDefault = False
        object TextTest: TText
          Align = Client
          Locked = True
          Size.Width = 256.000000000000000000
          Size.Height = 25.000000000000000000
          Size.PlatformDefault = False
          Text = 'ligne test '
        end
      end
      object ComboColorBox1: TComboColorBox
        Color = claWhite
        Position.X = 288.000000000000000000
        Position.Y = 62.000000000000000000
        Size.Width = 60.000000000000000000
        Size.Height = 22.000000000000000000
        Size.PlatformDefault = False
        TabOrder = 1
        OnChange = ComboColorBox1Change
      end
      object BindingsList1: TBindingsList
        Methods = <>
        OutputConverters = <>
        Left = 412
        Top = 21
        object LinkControlToPropertyFillColor: TLinkControlToProperty
          Category = 'Liaisons rapides'
          Control = ComboColorBox1
          Track = True
          Component = RectangleTest
          ComponentProperty = 'Fill.Color'
        end
      end
    end
    mais je trouve le résultat "limite"
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 390
    Points : 620
    Points
    620
    Par défaut
    je n'ai pas testé mais tu as cette discussion sur stackoverflow avec cette fonction pour Delphi

    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
    function GetContrastColor(ABGColor: TColor): TColor;
    var
      ADouble: Double;
      R, G, B: Byte;
    begin
      if ABGColor <= 0 then
      begin
        Result := clWhite;
        Exit; // *** EXIT RIGHT HERE ***
      end;
     
      if ABGColor = clWhite then
      begin
        Result := clBlack;
        Exit; // *** EXIT RIGHT HERE ***
      end;
     
      // Get RGB from Color
      R := GetRValue(ABGColor);
      G := GetGValue(ABGColor);
      B := GetBValue(ABGColor);
     
      // Counting the perceptive luminance - human eye favors green color...
      ADouble := 1 - (0.299 * R + 0.587 * G + 0.114 * B) / 255;
     
      if (ADouble < 0.5) then
        Result := clBlack  // bright colors - black font
      else
        Result := clWhite;  // dark colors - white font
    end;

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut
    Merci,

    J'ai essayé plusieurs calculs différents et pour l'instant celui-ci remporte la palme quand le travail se fait sur RGB

    Est-ce qu'utiliser HSL (Hue, Saturation et Luminance) ne serait pas une autre piste ?
    Mon test, nécessitant l'unité UIConsts fonctionne pas mal non plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm64.ComboColorBox1Change(Sender: TObject);
    var H,S,L : single;
    begin
      RGBtoHSL(RectangleTest.Fill.Color,H, S, L);
      if l>0.30
       then TextTest.TextSettings.FontColor:=TAlphaColorRec.Black
       else TextTest.TextSettings.FontColor:=TAlphaColorRec.White;
    end;
    pourquoi 0.30 ? Je me suis basé sur ce graphique
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut Améliorations
    Bonjour,

    À partir de mes constatations sur HSL j'en suis à cette fonction
    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
     
    function TextColor(const BackGround: TAlphaColor; const Range: Single = 0.3;
      const TextColor : TAlphaColor = TAlphacolorRec.Black;
      const ReverseColor: TAlphaColor = TAlphacolorRec.White): TAlphaColor;
    var H,S,L : single;
        TextL : single;
    begin
      // prise en compte de la couleur TextColor ?
        RGBtoHSL(TextColor,H, S, TextL);
     
      // prise en compte de la couleur ReverseColor ? 
      RGBtoHSL(BackGround,H, S, L);
      if L>Range
        then result:=TextColor
        else Result:=ReverseColor;
    end;
    Maintenant les questions qui se posent :
    Comment prendre en compte des couleurs de texte différentes (en exemple TextColor= TAlphacolorRec.Red)
    Tout ces "calculs" se font sans compter sur la transparence comment intégrer celle-ci ?

    Tout est, je pense, dans la condition. Une question de fourchette de valeurs mais peut-être aussi des tests sur les Teintes (H) et Saturation (S) ?
    J'ai cet article comme base de travail. Des idées à me soumettre ?

    Vous retrouverez les sources et l'exécutable ici
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Salut,
    Citation Envoyé par SergioMaster Voir le message
    Maintenant les questions qui se posent :
    Comment prendre en compte des couleurs de texte différentes (en exemple TextColor := TAlphacolorRec.Red)
    On a discuté de ça pendant un an, dans un sous-forum voisin, ça a commencé comme toi avec du texte en noir et blanc et ça a fini avec la couleur, mais il y en a 7 pages pleines à bloc de codes, d'images, de discussions, etc., et au bout du compte il ne peut pas y avoir de méthode fiable à 100 %, il y aura toujours, à certaines valeurs, des "à peu près", c'est comme ça, c'est la vie.

    Citation Envoyé par SergioMaster Voir le message
    Tous ces "calculs" se font sans compter sur la transparence ; comment intégrer celle-ci ?
    Pour la transparence, ce n'est qu'un artifice, au bout du compte l'écran affiche toujours une couleur R G B : je n'ai jamais vu de dalle transparente, encore moins de tube cathodique transparent, à l'époque où ces engins existaient.


    Un dernier mot à propos du lien que tu donnes, agréable à lire, mais une remarque : j'ai souvent vu les cercles chromatiques démarrer avec le rouge à "3 heures" et tourner dans le sens inverse des aiguilles d'une montre, alors méfiance !
    Certains codes se basent là-dessus (je pense à l'excellent site d'EFG, et il y en a d'autres).
    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

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut
    Bonsoir,
    Citation Envoyé par Jipété Voir le message
    On a discuté de ça pendant un an, dans un sous-forum voisin,
    Mais c'est une mine ce forum ! Je ne connaissais pas, merci pour toute cette lecture

    il y aura toujours, à certaines valeurs, des "à peu près", c'est comme ça, c'est la vie.
    j'en suis conscient

    Pour la transparence, ce n'est qu'un artifice, au bout du compte l'écran affiche toujours une couleur R G B
    bon, en faisant une recherche par parentèle genre si la transparence est < à un seuil alors prendre la couleur du parent (en récursif histoire de faire mumuse) ça doit pouvoir le faire


    Un dernier mot à propos du lien que tu donnes, agréable à lire
    c'est pour cela que je l'ai cité

    Certains codes se basent là-dessus (je pense à l'excellent site d'EFG, et il y en a d'autres).
    et zut, je n'ai même pas pensé à fouiller sur efg2.com
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut état d'avancement
    J'en suis là, une écriture de fonction

    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
     
      function TextColor(const BackGround: TAlphaColor; const Delta: Single = 0.3;
      const TextColor : TAlphaColor = TAlphacolorRec.Black;
      const ReverseColor: TAlphaColor = TAlphacolorRec.White): TAlphaColor;
      var H,S,L : single;
        D,TextS,TextL : single;
     
      begin
        D:=Delta;
        if D>0.5 then D:=0.5;
        if D<0 then D:=0;
     
        RGBtoHSL(BackGround,H, S, L);
        if (L>D)
          then result:=TextColor
          else Result:=ReverseColor;
      // insuffisant j'ai donc ajouté un test
       if SubtractColor(BackGround,Result)<=$FF then result:=ReverseColor;  // $FF pour noir et blanc mais ... 
      end;
    et une application
    Nom : Capture.PNG
Affichages : 583
Taille : 20,6 Ko
    Cela me convient en cas de couleur de fonte noir/blanc, à faire, d'autres tests

    nota : efg2.com a été versé aux abonnés absents
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 897
    Points : 6 024
    Points
    6 024
    Par défaut
    Hello Serge,
    En marge (?) de ton sujet, peut-être quelques idées à prendre ici:
    https://snook.ca/technical/colour_contrast/colour.html
    http://paletton.com
    https://www.colourlovers.com/

    Tout est très orienté web et ergonomie de site, mais tu sembles avoir la même problématique
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 043
    Points
    15 043
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    nota : efg2.com a été versé aux abonnés absents
    Non non, ça fonctionne son truc, mais c'est très mal fichu...

    Exemple en suivant le lien "Reference Library" depuis son site : je me retrouve sur la Wayback Machine, il y a un calendrier, des jours y sont en surbrillance (avec un rond bleu), y a qu'à mettre la souris sur le plus récent, une infobulle s'affiche avec une heure sous forme de lien, le cliquer et hop ! :

    Nom : wayback_efg.png
Affichages : 560
Taille : 55,1 Ko

    Et en cliquant sur "Color" par exemple, je retrouve le bazar au format efg habituel.

    ---
    Sinon, elle est bizarre ta capture d'écran : à gauche une police sans sérif très lisible sur écran, et à droite une police avec sérif, beaucoup plus brouillon et empâtée : ça impacte la lisibilité…
    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

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Sinon, elle est bizarre ta capture d'écran : à gauche une police sans sérif très lisible sur écran, et à droite une police avec sérif, beaucoup plus brouillon et empâtée : ça impacte la lisibilité…
    C'est juste une histoire de fonte non identique dans mon style, rein à voir avec le "calcul"
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. [XL-2010] Trouver la cellule qui convient
    Par fb62840 dans le forum Excel
    Réponses: 6
    Dernier message: 17/01/2018, 11h50
  2. Réponses: 0
    Dernier message: 24/07/2016, 12h45
  3. Réponses: 0
    Dernier message: 21/10/2014, 16h48
  4. Réponses: 17
    Dernier message: 09/02/2010, 17h22
  5. [VBA-E]Methode pour trouver une valeur qui apparait plusieur fois
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 23/05/2006, 14h11

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