Salut !
Je vais réaliser une conversion en niveau de gris.
Le bitmap source est stocké dans un TImage.
Il s'agit d'un 24 Bits donc je vais traiter directement avec les composantes RGB de chaque pixel.
Pour gagner du temps je vais utiliser ScanLine[Y], Pixels[X][Y] m'en ferait perdre !
La conversion est stockée dans un tableau dont les dimensions sont celles du bitmap.
J'aime bien organiser mes tableaux d'images en tant que ligne (y) * col (x) :
Byte I[480][640]; //le type Byte est suffisant pour mes niveaux de gris
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
| Graphics::TBitmap *B = Image1->Picture->Bitmap;
int we = B->Width;
int he = B->Height;
Byte *P;
Byte g;
for(int y = 0; y < he; y++) //ligne par ligne
{
P = (Byte*)B->ScanLine[y];
for(int x = 0; x < we; x++) //pixel par pixel
{
//conversion en niveau de gris
g = (Byte) (((P[0] * 11) + //bleu
(P[1] * 59) + //vert
(P[2] * 30)) / 100); //rouge
//Le niveau de gris dans mon tableau
I[y][x] = g;
//report dans le bitmap
//gris est tel que : rouge == vert == bleu == niveau de gris)
P[0] = g; // le bleu
P[1] = g; // le vert
P[2] = g; // le rouge
//chaque pixel est composé de 3 octets consécutifs donc...
P = P + 3; //prêt pour le pixel suivant
}
} |
A la suite de ça, mon image est convertie en niveaux de gris.
Le tableau est prêt pour un éventuel traitement (plus rapide par ce biais là).
A plus !
Partager