problème avec procédure ayant TImage comme parametre
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:
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 :
Code:
1 2 3 4 5 6 7 8
|
ImageToMatrice(Image1,matrice) ;
//
.
//TRAITEMENT
//
MatriceToImage(Image1,matrice) ; |
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:
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 :koi:
Vous me diriez peut être que le problème sera résolu en ajoutant l’instruction
Code:
Image2->Picture->Bitmap=Image1->Picture->Bitmap ;
Juste avant :
Code:
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.
Modifier la taille de l'image
Mon problème est résolu grâce à ce code:
Citation:
Envoyé par
henderson
Salut !
Le bon code est :
Code:
Image2->Picture->Bitmap->Assign(Image1->Picture->Bitmap);
Mais là un autre problème est survenu,Pour résumer un peu voila comment je procède:
-Charger Image1 (TImage) dans une matrice.(Procédure ImageToMatrice)
-Effectuer les traitements sur la matrice.
-Afficher la matrice dans Image2(TImage) avec la procédure MatriceToImage.
Et parmi les "traitements" y en a un qui consiste à modifier la taille de l'image.Hélas les proptiétés :
Image2->Picture->Width
Image2->Picture->Height
ne sont pas accèssibles (on ne peut les modifier).
Le problème survient donc lors de l'affichage dans Image2,le traitement s'effectue bien mais la taille de l'image reste inchangée !