bonjour j'ai des difficultes pour charger une image bmp et la lire pixel par pixel
car cette etape me permet de faire une segmentation d'image satilitaire
Version imprimable
bonjour j'ai des difficultes pour charger une image bmp et la lire pixel par pixel
car cette etape me permet de faire une segmentation d'image satilitaire
Salut,
quel est le code que tu as fait?
Où se trouve le problème?
Il faut utiliser la méthode Pixel du TImage:
Il existe aussi la méthode ScanLine, qui est plus rapide.Code:
1
2
3
4 int R = (Image->Canvas->Pixels[i][j]&0xFF0000)>>16, G = (Image->Canvas->Pixels[i][j]&0x00FF00)>>8, B = (Image->Canvas->Pixels[i][j]&0x0000FF);
Salut !
Je te conceil vivement d'utiliser la méthode ScanLine qui beacoups plus rapide, et moins gourmante que la première méthode.
Tu trouvera plein d'exemples sur ce forum; Handerson n'as pas céssé d'en contribuer...
A+
Salut !
Une dernière fois :
On suppose ceci :Code:
1
2
3
4
5
6
7
8 class jPixel { public : Byte Blue; Byte Green; Byte Red; };
On aura donc ceci à faire :Code:
1
2
3 AnsiString Filename; //chemin complet du bitmap Graphics::TBitmap *Bitmap = new Graphics::TBitmap; //ne pas oublier de le détruire
L'accès aux composantes (R,G,B) est simple et rapide :Code:
1
2
3 Bitmap->LoadFromFile(Filename); Bitmap->PixelFormat = pf24bit; // convertir en 24 bits
=======================Code:
1
2
3
4
5
6
7
8
9
10
11
12 jPixel *Line; for(int y = 0; y < Bitmap->Height; y++) { Line = (jPixel*)Bitmap->ScanLine[y]; for(int x = 0; x < Bitmap->Width; x++) { ...Line[x].Red... ...Line[x].Green... ...Line[x].Blue... } }
BITMAPS COULEURS 8 BITS
=======================
On peut convertir les bitmaps 8 bits en 24 bits, ce qui est une solution de facilité mais qui nécessite plus de ressources mémoire.
Le traitement sur un bitmap 8 bits est par contre totalement différent puisque chaque pixel (vu par ScanLine) correspond à l'index d'une couleur dans la palette.
Dans ce cas précis, comme il n'y a que 256 teintes possibles, il suffit de les récupérer dans un tableau.
On y gagnera énormément, en lieu et place de Pixels[x][y] effectué sur l'intégralité du bitmap 8 bits.
On déclare :
Exemple de code pour récupérer les 256 teintes de la palette d'un bitmap :Code:
1
2 PALETTEENTRY Colors[256];
On accèdera aux composantes RGB en faisant :Code:
1
2
3 Graphics::TBitmap *Bitmap = Image1->Picture->Bitmap; //pour montrer que... GetPaletteEntries(Bitmap->Palette, 0, 256, Colors); // récupération des 256 couleurs
Ce qui évitera de solliciter les GetR, GetG et GetBValue suite à Pixels[x][y] !Code:
1
2
3
4
5
6
7
8
9
10
11 PALETTEENTRY color; Byte *Line; ... Line = (Byte*)Bitmap->ScanLine[y]; ... color = Colors[ Line[x] ]; ...color.peRed ...color.peGreen ...color.peBlue
Pour tout ce qui concerne le traitement d'images on a intérêt à aller dans le sens de la rapidité d'exécution et non dans celle de la rédaction du code !
A plus !
:salut:
Ne serais pas :king: de lancer un sous forum c++Builder pour le traitement d'image ?
Salut !
Il y a pas mal de choses sur le forum Algorithmes -> Traitement d'images !
A plus !