Explication sur un code source
sarah
-
sarah -
sarah -
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:
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
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:
- Explication sur un code source
- Code ascii - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Scanner un qr code sur pc - Guide
2 réponses
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
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
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
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