Explication sur un code source

Bonjour,
bon j'ai trouvé ce morceau de code en c++ builder sur le traitement d'image mais j'ai pas bien compris ,est ce qu'il y a quelqu'un peut m'aider pour bien comprendre ,je suis débutante dans ce domaine:

long MaskR=0x000000FF;
long MaskG=0x0000FF00;
long MaskB=0x00FF0000;
double *R,*G,*B;
Series1->Clear();
Series2->Clear();
Series3->Clear();


Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
R=new double[256];
G=new double[256];
B=new double[256];
try
  {
    pBitmap->Assign(Image1->Picture->Graphic);
    memset(R,0,256*sizeof(double));
    memset(G,0,256*sizeof(double));
    memset(B,0,256*sizeof(double));
////    Version utilsant Pixels
    for (int y = 0; y < pBitmap->Height; y++)
      for (int x = 0; x < pBitmap->Width; x++)
        {
        ++R[(ColorToRGB(pBitmap->Canvas->Pixels[x][y]) & MaskR)];
        ++G[(ColorToRGB(pBitmap->Canvas->Pixels[x][y]) & MaskG)/256];
        ++B[(ColorToRGB(pBitmap->Canvas->Pixels[x][y]) & MaskB)/65536];
        }
  }
catch (...)
  {
    ShowMessage("Impossible de charger ou modifier le bitmap");
  }

Series1->AddArray(R,256);
Series2->AddArray(G,256);
Series3->AddArray(B,256);

delete pBitmap;
delete R;
delete G;
delete B;

surtout j'ai pas bien compris le role de masque ici et pourquoi on a divisé sur 256 pui 65536.
merci d'avance
tt mes salutations
Configuration: Windows Vista
Firefox 3.0.15

2 réponses

  • Votes
  • Date
  • Date décroissante
  1. C'est tout simple.
    Le principe:
    un pixel se décompose en 3 valeurs rouge, vert et bleu chacune codé sur un octet (valeur entre 0 et 255)
    Souvent, ces trois valeur sont rassemblés dans une seule variable de 4 octets dont les bits 0 a 7 sont pour le rouge, de 8 à 15 pour le vert et 16 à 23 pour le rouge.
    Le plus souvent on utilise les décalage pour faire ca comme ici;

    long val =( (B<<8) + G) <<8 + R
    (on prend le bleu, on décale de 8 octets vers la gauche, on ajoute le vert , on decale le tout de 8octets a gauche et on ajoute le rouge. (tu suis?)

    ce qu'il faut savoir qu'un décalage d'un bit a gauche correspond a multiplié par 2 donc un décalage de 8 bits correspond a 2^8 =256.
    En d'autre terme le code suivant est équivant:

    long val =( (B*256) + G) *256 + R
    ou en décomposant
    long val = (B*65535) + G *256 + R

    -
    Grou29
    http://lienssanslien.free.fr
    1. j'ai oublié d'expliquer le masquage:
      le masquage se fait par l'opérateur & appelé "et" qui permet de mettre a zéro des bits.
      si tu as val= 0x00112233 et un masq=0x0000FF00
      le calcul val & masq donne 0x00002200. Tous les bits ou le masque est a 1 sont conservés et les autre mis a 0.

      dans ton code, la ligne
      ++G[(ColorToRGB(pBitmap->Canvas->Pixels[x][y]) & MaskG)/256];

      prend la couleur en x, y, mais un masque pour ne garder que la couleur verte et divise par 256 pour revenir sur une valeur sur 8 bits

      C'est clair?

      -
      Grou29
      http://lienssanslien.free.fr
      1. Bonsoir grou29 vraiment c'est gentil de ta part
        je te remercie pour cette explication elle m'a bcp aidé!! :)
        tout est claire pour le moment .
        merci encore .... :)

        salutations.