Bonjour à vous tous,
Je suis actuellement entrain de réaliser une petit logiciel sur le traitement d’image,Je ne travaille qu’avec des Image BMP 24 bits (pf24bit) et de niveau de gris.
Afin de minimiser le nombre d’appels des méthodes ScanLine et Canvas->Pixels,J’ai choisi de charger l’image du TImage vers une matrice (Byte mat[3000][3000]), et après avoir effectuer les traitement sur la matrice transférer les données de la matrice vers un autre TImage,et pour cela j’ai crée deux procédures (Grace à Henderson) dont voici les prototypes :
void ImageToMatrice(TImage *img,byte mat[3000][3000])
void MatriceToImage(TImage *img,byte mat[3000][3000])
La première procédure remplit la matrice à partir de l’image qu’a chargé l’utilisateur dans un TImage (Tout en la transformant en niveau de gris)
La deuxième procédure transfert le contenu de la matrice vers un TImage .
Voici leurs codes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 void ImageToMatrice(TImage *img,byte mat[3000][3000]) { class jPixel { public : Byte Blue; Byte Green; Byte Red; }; Graphics::TBitmap *Bitmap = new Graphics::TBitmap; jPixel *Pixel; int grey, blue, red, green; Graphics::TBitmap *B = img->Picture->Bitmap; for(int y = 0; y < B->Height; y++) { Pixel = (jPixel*)B->ScanLine[y]; for(int x = 0; x < B->Width; x++) { grey = (Pixel[x].Red+ Pixel[x].Green+ Pixel[x].Blue) /3; mat[x][y]=grey; } } img->Repaint(); } void MatriceToImage(TImage *img,byte mat[3000][3000]) { class jPixel { public : Byte Blue; Byte Green; Byte Red; }; Graphics::TBitmap *Bitmap = new Graphics::TBitmap; jPixel *Pixel; int grey, blue, red, green; Graphics::TBitmap *B ; B=img->Picture->Bitmap; for(int y = 0; y < B->Height; y++) { Pixel = (jPixel*)B->ScanLine[y]; for(int x = 0; x < B->Width; x++) { Pixel[x].Red=mat[x][y]; Pixel[x].Green=mat[x][y]; Pixel[x].Blue=mat[x][y]; } } img->Repaint(); }
Maintenant afin de tester ces deux procédures,j’ai déposé dans ma forme deux TImage Image1,Image2 et un bouton.Image1 contient une BMP et Image2 est vide (Invisible à l’exécution) .
A l’événement OnClick du bouton voici ce que j’ai mis :
Là pas de soucis tout s’effectue très bien,Mais si je voulais garder l’image originale et afficher le résultat dans Image2 de cette manière :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ImageToMatrice(Image1,matrice) ; // . //TRAITEMENT // MatriceToImage(Image1,matrice) ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ImageToMatrice(Image1,matrice) ; // . //TRAITEMENT // MatriceToImage(Image2,matrice) ;
Là rien ne s’affiche dans Image2 .Et c’est du faite qu’elle ne contienne pas de BMP initialement je pense
Vous me diriez peut être que le problème sera résolu en ajoutant l’instruction
Juste avant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Image2->Picture->Bitmap=Image1->Picture->Bitmap ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part MatriceToImage(Image2,matrice) ;
Et c’est le cas !mais je ne veux pas être contraint d’ajouter cette instruction à chaque fois car je voudrai faire appel à ces procédures depuis plusieurs projets.
Quelqu’un aurai une idée ?
Merci à vous de votre patience.
N’hésiter pas à me demander quoi que ce soit si je n’ai pas été clair sur certains points.
Cordialement.
Partager