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

C++Builder Discussion :

Degrade de couleur dans un canvas


Sujet :

C++Builder

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 92
    Points
    92
    Par défaut Degrade de couleur dans un canvas
    Bonjour j'aimerai afficher dans un Timage (qui posséde un canvas)

    un dégradé entre deux couleur selon la forme suivante

    Couleur 1
    tend vers
    Couleur 2
    ten vers
    Couleur 1

    pour le moment j'arive simplement a dessiner un rectangle plein

    avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      image->Canvas->Pen->Color = PCouleur_Fond;
      image->Canvas->Brush->Color = PCouleur_Fond;
      image->Canvas->Brush->Style = bsSolid;
      image->Canvas->Rectangle(0,0,image->Width,image->Height);
    j'ai vu que je pouvais me déplacer dans un canvas à l'aide de ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      for (int ligne=0; ligne< degrade->Height; ligne++)
      {
        image->Canvas->Pen->Color = ????;
        image->Canvas->MoveTo(0,ligne);
        image->Canvas->LineTo(Width,ligne);
      }
    mon probléme est de calculer la couleur à mettre à la place des ????? pour que le dessin représente le motif

    présenté au debut du topic,

    si quelqu'un pouvait m'aiguiller

    merci d'avance

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 137
    Points : 161
    Points
    161
    Par défaut
    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
     
    void ColorToRGB(Graphics::TColor value, int &R, int &G, int &B)
    {
            int v = ColorToRGB(value);
            R = GetRValue(v);
            G = GetGValue(v);
            B = GetBValue(v);
    }
     
    Graphics::TColor RgbToColor(int R, int G, int B)
    {
            if (R > 255) R = 255;if (R < 0) R = 0;
            if (G > 255) G = 255;if (G < 0) G = 0;
            if (B > 255) B = 255;if (B < 0) B = 0;
            return (Graphics::TColor(B * 65536 + G * 256 + R));
    }
    Tu peux te servir de ces deux fonctions pour générer la couleur pour chaque ligne (interpolation linéaire de R,G, et B).

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 92
    Points
    92
    Par défaut
    aprés avoir posté, j'ai continué de chercher , et je suis arrivé à programmer ce bout de code

    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
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
      TColor ecart=0;
      int nbLigne = Degrade->Height/2;
     
      if (PCouleur_Fond > PCouleur_Degrade)
      {
        ecart = PCouleur_Fond - PCouleur_Degrade;
        Degrade->Canvas->Pen->Color =  PCouleur_Fond;
      }
      else
      {
        ecart = PCouleur_Degrade - PCouleur_Fond;
        Degrade->Canvas->Pen->Color =  PCouleur_Degrade;
      }
     
      for (int ligne=0; ligne< Degrade->Height; ligne++)
      {
        if (ligne < Degrade->Height/2)
        {
          Degrade->Canvas->Pen->Color = Degrade->Canvas->Pen->Color - (ecart/nbLigne);
        }
        if (ligne == Degrade->Height/2)
        {
          if (PCouleur_Fond > PCouleur_Degrade)
            Degrade->Canvas->Pen->Color = PCouleur_Degrade;
          else
            Degrade->Canvas->Pen->Color = PCouleur_Fond;
        }
     
        if (ligne > Degrade->Height/2)
        {
          Degrade->Canvas->Pen->Color = Degrade->Canvas->Pen->Color + (ecart/nbLigne);
        }
        Degrade->Canvas->MoveTo(0,ligne);
        Degrade->Canvas->LineTo(Width,ligne);
      }
    }
    ce code fonctionne qu'a moitié selon la taille du TImage (Degrade) et suivant les couleurs et bien le dégradé fonctionne ou non :'(

    quelqu'un saurait t'il d'où vient l'erreur ?

    @slylafone : pense tu que l'utilisation de tes fonctions permettent de régler mon problème ? si oui, a quel moment dois je les utiliser ?

    merci d'avance

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 137
    Points : 161
    Points
    161
    Par défaut
    Je pense qu'il faut plutôt faire une interpolation sur les valeurs R, G et B individuellement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int Rsrc, Gsrc, Bsrc;
    int Rdest, Gdest, Bdest;
    ColorToRgb(color_src, Rsrc, Gsrc, Bsrc);
    ColorToRgb(color_dest, Rdest, Gdest, Bdest);
    for (int i = 1; i <= Height; i++)
          {
          Canvas->Pen->Color = RgbToColor(i*Rdest/Height + (Height-i)*Rsrc/Height,
                                          i*Gdest/Height + (Height-i)*Gsrc/Height,
                                          i*Bdest/Height + (Height-i)*Bsrc/Height);
          Canvas->MoveTo(1, i);
          Canvas->LineTo(Width, i);
          }

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par slylafone
    Je pense qu'il faut plutôt faire une interpolation sur les valeurs R, G et B individuellement.
    oui, effectivement c'est ce que j'ai fait par la suite, je posterai le code lundi

    en tout cas merci pour ton aide

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. [Python 2.X] Ne pas modifier la dynamique de couleur dans un canvas de Tkinter
    Par Nicolas51 dans le forum Tkinter
    Réponses: 1
    Dernier message: 03/05/2015, 12h10
  3. Excel: Comment créer un degradé de couleurs dans cellules?
    Par Turlututuh dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/12/2005, 00h04
  4. Ecrire du texte en couleurs dans un composant
    Par wutang dans le forum Composants
    Réponses: 11
    Dernier message: 12/07/2004, 10h55
  5. [TP]dégradé de couleur
    Par mikoeur dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 10/11/2002, 23h02

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