Explication sur un code source

Fermé
sarah - 2 déc. 2009 à 20:01
 sarah - 3 déc. 2009 à 18:54
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
A voir également:

2 réponses

grou29 Messages postés 39 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 19 mai 2010 9
2 déc. 2009 à 20:59
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
0
grou29 Messages postés 39 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 19 mai 2010 9
3 déc. 2009 à 09:13
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
0
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.
0