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
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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+
Pour charger une image Bmp :
et pour lire un pxl :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 Image1 -> Picture -> LoadFromFile("c:\\monimage.bmp") ;
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 Tu utilise soit ScanLine soit Image1 -> Canvas -> Pixels[Colonne][Ligne] ; // tu aurra les valeurs en couleurs
Salut !
Une derni�re fois :
On suppose ceci :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8 class jPixel { public : Byte Blue; Byte Green; Byte Red; };
On aura donc ceci � faire :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 Bitmap->LoadFromFile(Filename); Bitmap->PixelFormat = pf24bit; // convertir en 24 bits
=======================
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 PALETTEENTRY Colors[256];
On acc�dera aux composantes RGB en faisant :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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 !
Ne serais pasde 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 !
Partager