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

Lazarus Pascal Discussion :

Saturation couleur avec FPColor


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut Saturation couleur avec FPColor
    Bonjour, je cherche dans mon programme à tracer un trait de couleur rouge (par exemple) et jouer sur la saturation de celui ci.
    J'ai trouver que le type FPColor permettait de gerer cela avec les paramètres (r,g,b,a) où a est la saturation.

    J'ai donc tapé ceci (les valeurs rgb sont aléatoires ici)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fpclr:=FPColor(100,100,100,100);
    PaintBox1.Canvas.Pen.Color:=FPColorToTColor(fpclr);
    Aucune erreur de compilation mais pas de trait de couleur non plus ....

    Par contre à l'ancienne avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PaintBox1.Canvas.Pen.Color:=clRed;
    Là ma figure est tracée en rouge.

    Pouvez-vous m'aider ?
    Merci

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Jia,

    R = Red
    G = Green
    B = Blue

    A = Alpha, qui indique la transparence, pas la saturation, qui est autre chose, utilisé dans d'autres systèmes de couleur.

  3. #3
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    fonction necessaires :

    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
    const
      __R = 1/255;
      __1T= 1/3;
      __2T= 2/3;
     
    procedure HSL2RGB(H, S, L: single; var R, G, B: byte);
      function Hue2RGB(v1, v2, vH: single): single;
      begin
        if vH < 0 then vH := vH + 1;
        if vH > 1 then vH := vH - 1;
     
        if (6*vH) < 1 then exit( v1 + (v2-v1) * 6 * vH);
        if (2*vH) < 1 then exit( v2 );
        if (3*vH) < 2 then exit( v1 + (v2-v1) * ((__2T - vH) * 6));
        result := v1;
      end;
    var
      var_1, var_2: single;
    begin
      if S = 0 then
      begin
        R := round(L * 255);
        G := round(L * 255);
        B := round(L * 255);
      end
      else
      begin
        if L < 0.5 then
          var_2 := L * ( 1+S )
        else
          var_2 := (L+S) - (S*L);
     
        var_1 := 2 * L - var_2;
     
        R := round(255 * hue2RGB(var_1, var_2, H+__1T));
        G := round(255 * hue2RGB(var_1, var_2, H));
        B := round(255 * hue2RGB(var_1, var_2, H-__1T));
      end;
    end;
     
    procedure RGB2HSL(R, G, B: byte; var H, S, L: single);
    var var_R, var_G, var_B, del_Max, del_Max2, del_R, del_G, del_B, var_Min, var_Max : single;
    begin
      var_R := R * __R;                     //RGB from 0 to 255
      var_G := G * __R;
      var_B := B * __R;
     
      if var_R > var_G then
      begin
        if var_B < var_G then
          var_Min := var_B
        else
          var_Min := var_G;
        if var_B > var_R then
          var_Max := var_B
        else
          var_Max := var_R;
      end
      else
      begin
        if var_B < var_R then
          var_Min := var_B
        else
          var_Min := var_R;
        if var_B > var_G  then
          var_Max := var_B
        else
          var_Max := var_G
      end;
     
      del_Max := var_Max - var_Min;         //Delta RGB value
     
      L := (var_Max + var_Min) * 0.5;
     
      if del_Max = 0 then         //This is a gray, no chroma...
      begin
        H := 0;
        S := 0;
      end
      else                                    //Chromatic data...
      begin
        if  L < 0.5 then
          S := del_Max / (var_Max + var_Min)
        else
          S := del_Max / (2 - var_Max - var_Min);
     
        del_Max2 := del_Max*0.5;
     
        del_R := (((var_Max - var_R)/6) + del_Max2) / del_Max;
        del_G := (((var_Max - var_G)/6) + del_Max2) / del_Max;
        del_B := (((var_Max - var_B)/6) + del_Max2) / del_Max;
     
        if var_R = var_Max then
          H := del_B-del_G
        else
        if var_G = var_Max then
          H := __1T + del_R-del_B
        else
        if var_B = var_Max then
          H := __2T + del_G-del_R;
     
        if H < 0 then
          H := H + 1;
        if H > 1 then
          H := H - 1;
      end;
    end;
    fonctions utilitaires :

    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
     
    procedure ColorExplode(aColor: TColor; var R, G, B: byte);
    begin
      R := byte(aColor);
      G := byte(aColor shr 8);
      B := byte(aColor shr 16);
    end;
     
    procedure ColorImplode(R, G, B: byte; var aColor: TColor);
    begin
      aColor := (B shl 16) or (G shl 8) or R;
    end;
     
    function RGBSat(aColor: TColor; aSaturation: single): TColor;
    var
      R, G, B: byte;
      H, S, L: single;
    begin
      RGB2HSL(byte(aColor), byte(aColor) shr 8, byte(aColor) shr 16, H, S, L);
      HSL2RGB(H, aSaturation, L, R, G, B);
      result := (B shl 16) or (G shl 8) or R;
    end;
    [/code]
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    Merci je vais essayer vos méthodes, et surtout merci pour le A, j'aurai pu m'énerver dessus encore des heures
    je dirai si cela marche ou non

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    J'ai implanté le code dans l'unité.
    Ca compile.

    Par contre je ne le comprend pas....
    Par exemple, je veux tracer en bleu, je dois mettre cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PaintBox1.Canvas.Pen.Color:=RGBSat(clBlue,100);
     
                   PaintBox1.Canvas.LineTo(ix,iy);
    ??

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2010
    Messages : 58
    Par défaut
    Suis désolé de vous presser mais personne ne pourrait m'aider ?


    Si j'ai bien compris la fonction couleur implode va transformer la couleur (ici rouge) en byte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CouleurImplode(255,0,0)
    Puis j'ai utilisé la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PaintBox1.Canvas.Pen.Color:=RGBSat(aColor,1.0)
    ;
    Si je met par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PaintBox1.Canvas.Pen.Color:=RGBSat(clRed,1.0)
    la tout fonctionne.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/07/2006, 15h28
  2. Mettre de la couleur avec conio
    Par pi-2r dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 28/06/2006, 17h13
  3. Réponses: 2
    Dernier message: 26/04/2006, 21h34
  4. comment mettre de la couleur avec format/write ?
    Par gedeon555 dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2006, 09h12
  5. pb couleur avec Scanline
    Par bobymaw dans le forum C++Builder
    Réponses: 6
    Dernier message: 10/05/2004, 22h25

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