IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

probl�me avec proc�dure ayant TImage comme parametre


Sujet :

C++Builder

  1. #1
    Membre �m�rite Avatar de b_reda31
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : Alg�rie

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par d�faut 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 : 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 :
    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) ;
    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
    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

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Image2->Picture->Bitmap=Image1->Picture->Bitmap ;  
    Juste avant :
    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.

  2. #2
    Membre �clair� Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par d�faut
    le autosize de ton image 2 est bien a true ?

  3. #3
    Membre �m�rite Avatar de b_reda31
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : Alg�rie

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par d�faut
    Citation Envoy� par Baxter67 Voir le message
    le autosize de ton image 2 est bien a true ?
    Je viens de le mettre � True et le probl�me persiste!



    Je vais essayer de r�sumer un peu mon probl�me:
    dans ma forme je dispose d'un TImage qui ne contient pas de BMP (IL EST VIDE)Donc invisible.
    Et je voudrai lorsque l'utilisateur presse sur un bouton le TImage se charge � partir d'une matrice (La proc�dure est d�ja impl�ment�e).
    Si le TImage contenait initialement un BMP la matrice s'affiche bien.Mais si le TImage est vide alors l appel de ma proc�dure ne fait rien!

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Salut !

    Le bon code est :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    Image2->Picture->Bitmap->Assign(Image1->Picture->Bitmap);
    Par contre... ton histoire de matrice... ???

    Ce ne serait pas plus simple de traiter de bitmap � bitmap au lieu de passer par cette matrice ?

    Que te manque t-il ? Un bitmap 8 bits r�f�rentiel � niveaux de gris pour repr�senter le r�sultat du traitement ?

    A plus !

  5. #5
    Membre �m�rite Avatar de b_reda31
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : Alg�rie

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par d�faut
    Citation Envoy� par henderson Voir le message
    Salut !

    Le bon code est :


    Image2->Picture->Bitmap->Assign(Image1->Picture->Bitmap);
    Je ne veux pas afficher Image1 dans Image2 mais plut�t la matrice dans Image2.
    Voici un petit sch�ma qui r�sume ce que je veux faire:

    Tous s�effectue tr�s bien jusqu�� l�affichage de la matrice apr�s traitement (Proc�dure MatriceToImage).Ici si j�affiche la matrice dans Image1 y a pas de soucis l�image trait�e s�affiche bien. MAIS si je veux garder l�image originale dans Image1 et afficher l�image trait�e dans Image2, l� rien de s�affiche car Image2 est initialement vide !



    Envoy� par Henderson :
    Par contre... ton histoire de matrice... ???

    Ce ne serait pas plus simple de traiter de bitmap � bitmap au lieu de passer par cette matrice ?

    Pour le "traitement",Il m'est beaucoup plus facile de travailler avec une matrice au lieu d'utiliser les m�thode Canvas->Pixels et ScanLine.


    Envoy� par Henderson :
    Que te manque t-il ? Un bitmap 8 bits r�f�rentiel � niveaux de gris pour repr�senter le r�sultat du traitement ?
    Je ne comprends pas cette question.
    Je travaille qu�avec des Image 24Bits de niveau de gris,et si �ventuellement l�utilisateur charge une image RGB c�est la proc�dure ImageToMatrice qui convertira cette Image en niveau de gris.(Dans la matrice)

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Salut !

    Si Image2 est vide il faut bien lui assigner un bitmap donc tant qu'� faire on lui assigne un bitmap existant, celui de Image1 (si c'est le m�me type de bitmap...)!

    Si je parts du principe que :
    - l'image initiale est en 24 bit couleurs
    - l'image initiale est convertie ... et sortie en niveaux de gris (8 bit)
    Je n'ai besoin que d'un bitmap 8 bits en sortie, parce que �a ne sert � rien de m�moriser 3 composantes identiques !
    Comme on est ici dans du r�f�rentiel de gris (0 = noir ... 255 = blanc) � cause du traitement, on a int�ret � charger Image2 avec un bitmap � niveaux de gris.
    J'ai donn� du code en ce sens :

    http://www.developpez.net/forums/sho...d.php?t=544165

    Il est possible de matricer les lignes du bitmap retourn�es par ScanLine.

    Voici un exemple :

    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;
    };
    En global :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    Byte **Dest_Matrice = NULL;
    jPixel **Srce_Matrice = NULL;
    Pour te faire plaisir, on va matricer les deux bitmaps, convertir en niveaux de gris et afficher...

    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
     
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    Graphics::TBitmap *Srce = Image1->Picture->Bitmap;
    Graphics::TBitmap *Dest = Image2->Picture->Bitmap;
    int we = Srce->Width;
    int he = Srce->Height;
    Dest->Width = we;
    Dest->Height = he;
     
    //Matriçage du bitmap Srce
    if(Srce_Matrice != NULL) delete [] Srce_Matrice;
    Srce_Matrice = new jPixel*[he];
    for(int j = 0; j < he; j++) Srce_Matrice[j] = (jPixel*)Srce->ScanLine[j];
     
    //Matriçage du bitmap Dest
    if(Dest_Matrice != NULL) delete [] Dest_Matrice;
    Dest_Matrice = new Byte*[he];
    for(int j = 0; j < he; j++) Dest_Matrice[j] = (Byte*)Dest->ScanLine[j];
     
    /**************************************************************
    A ce stade, les adresses des lignes resteront valides tant que 
    l'on aura pas touché aux propriétés du bitmap qui viendraient 
    modifier ses dimensions (ca vaut aussi pour PixelFormat) !!! !!!
    ***************************************************************/
     
    //Conversion en niveau de gris de Image1 vers Image2
    //Et comme tu aimes bien les matrices...
     
    for(int y = 0; y < he; y++)
        {
        for(int x = 0; x < we; x++)
            {
            Dest_Matrice[y][x] = (Byte)((Srce_Matrice[y][x].Blue +
                                         Srce_Matrice[y][x].Green +
                                         Srce_Matrice[y][x].Red) / 3);
            }
        }
     
    //On peut, a la suite de ça, lisser... ou effectuer d'autres traitements...
     
    //Et on termine avec :
    Image2->Repaint();
    }
    Ne pas oublier de quitter l'application en faisant :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    if(Dest_Matrice != NULL) delete [] Dest_Matrice;
    if(Srce_Matrice != NULL) delete [] Srce_Matrice;
    }
    A plus !

  7. #7
    Membre �m�rite Avatar de b_reda31
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : Alg�rie

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par d�faut
    Merci infiniment pour votre patience et votre aide Henderson.

    Envoy� par Henderson

    ...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    //Et comme tu aimes bien les matrices...
    ...

    A vrai dire,il n y a rien entre moi et les matrices je vous l'assure ...c'est juste que Canvas->Pixels est tr�s longue � l'�x�cution.Et je ne maitrise pas tr�s bien ScanLine,la notion de pointeur ici me parait encore un peu vague...Mais j y vois de plus en plus clair gr�ce � vous.
    Merci encore.

  8. #8
    Membre �m�rite Avatar de b_reda31
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : Alg�rie

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par d�faut Modifier la taille de l'image
    Mon probl�me est r�solu gr�ce � ce code:

    Envoy� par henderson
    Salut !

    Le bon code est :


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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 !

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Salut !

    Tout simplement parce qu'on a deux objets distincts avec leur propres dimensions :
    - celles du bitmap (dimensions r�elles de l'image)
    - celles du TImage (dimensions de la lucarne dans laquelle se dessine son bitmap)

    Si on fixe Image2->AutoSize � true on oblige Image2 � aligner ses dimensions sur celles de son bitmap, celles qui en d�finitive sont induites par Assign (puisque l'on effectue une copie physique du bitmap).

    A plus !

  10. #10
    Membre �m�rite Avatar de b_reda31
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : Alg�rie

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par d�faut
    Donc il est impossible de charger une matrice dont la taille est "variable" dans un TImage?

  11. #11
    Membre �m�rite Avatar de b_reda31
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : Alg�rie

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par d�faut
    Citation Envoy� par henderson Voir le message
    Salut !

    Tout simplement parce qu'on a deux objets distincts avec leur propres dimensions :
    - celles du bitmap (dimensions r�elles de l'image)
    - celles du TImage (dimensions de la lucarne dans laquelle se dessine son bitmap)



    A plus !
    Vous m'aviez donn� la solution,j'avais juste mal compris.
    En plus de modifier la taille du Bitmap fallait modifier celle du TImage...


    Merci encore � vous Henderson !!

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Salut !

    Si on fixe la propri�t� AutoSize de Image2 � true, dans ce cas Image2 ajustera autommatiquement ses propres dimensions sur celles de son bitmap.

    A plus !

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. probl�me avec proc�dure stock�e
    Par kanebody dans le forum SQL Proc�dural
    R�ponses: 1
    Dernier message: 04/08/2009, 13h55
  2. [AC-2003] Affichage d'un etat avec une fonction ayant date comme parametre
    Par yupyupxav dans le forum IHM
    R�ponses: 0
    Dernier message: 06/06/2009, 00h43
  3. [A-03] Probl�me avec proc�dure "acDialog"
    Par moilou2 dans le forum IHM
    R�ponses: 2
    Dernier message: 22/10/2008, 12h00
  4. Creation d'un Sub avec un tableau dynamique comme parametre
    Par Nico820 dans le forum Macros et VBA Excel
    R�ponses: 2
    Dernier message: 31/07/2008, 07h16
  5. R�ponses: 1
    Dernier message: 17/07/2006, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo