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 :

Dessiner un histogramme dans un autre TForm


Sujet :

C++Builder

  1. #1
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut Dessiner un histogramme dans un autre TForm
    salut,

    je dessine un histogramme dans un TImage d'une autre forme, mon souci est que je ne peux voir mon histogramme en appelant la deuxième forme par Show(), le problème ne se pose pas si je mets ce code dans un bouton de la deuxième forme.

    Merci pour votre aide.

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Je n'ai pas compris ton problème.
    Que souhaite-tu faire exactement?

  3. #3
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    salut,

    merci sat83 pour votre attention,

    j'ai codé le dessin de l'histogramme dans un bouton de TForm1 et je désir l'afficher dans un TImage de TForm2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TForm1::HistogrammeClick(TObject *Sender)
    {
    //... je mets ici le code du dessin de l'histogramme dans un TImage de TForm2
     
    Form2->Show(); 
     
     
     
    }
    je veux que l'histogramme dessiné sur le TImage de la Form2 s'affiche une foi appeler TForm2.

    j'espère que j'étais claire

    merci d'avance

  4. #4
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Je ne comprend pas le problème avec ton code actuel? Désolé

  5. #5
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Je ne comprend pas le problème avec ton code actuel? Désolé
    merci quand même crayon.

    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
     
    void __fastcall TPreTraitement::AfficherHistogrammeClick(TObject *Sender)
    {
     
     
     // Dessin des axes de l'histogramme
    Histogramme->Canvas->Pen->Color=clBlack;
    Histogramme->Canvas->MoveTo(Histogramme->ImageH->Left,70);
    Histogramme->Canvas->LineTo(Histogramme->ImageH->Left,300);
     
    Histogramme->Canvas->MoveTo(Histogramme->ImageH->Left,300);
    Histogramme->Canvas->LineTo(Histogramme->ImageH->Width,300);
     
     
    // Dessin de l'histogramme ...
    Histogramme->Canvas->Pen->Color=clRed;
    for(int i=0;i<255; i++) {
    Histogramme->Canvas->MoveTo(i+Histogramme->ImageH->Left,300);
     
     
     
     Histogramme->Canvas->LineTo(i+Histogramme->ImageH->Left, 300-PreTraitement->H[i]/100);     
     
      }
     
    Histogramme->Show();
     
    }
    l'histogramme est dessiné dans ImageH de la 2 eme forme nommée Histogramme. mon souci est que ImageH ne s'affiche pas en exécutant le code ci dessus

    Merci d'avance

  6. #6
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Citation Envoyé par SmileSoft Voir le message
    l'histogramme est dessiné dans ImageH de la 2 eme forme nommée Histogramme.
    Pourtant tu as l'air de dessiné directement sur le Canvas de ta Form (Histogramme->Canvas)???:

  7. #7
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    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
     
     // Dessin des axes de l'histogramme
    Histogramme->ImageH->Canvas->Pen->Color=clBlack;
    Histogramme->ImageH->Canvas->MoveTo(Histogramme->ImageH->ImageH->Left,70);
    Histogramme->ImageH->Canvas->LineTo(Histogramme->ImageH->ImageH->Left,300);
     
    Histogramme->ImageH->Canvas->MoveTo(Histogramme->ImageH->ImageH->Left,300);
    Histogramme->ImageH->Canvas->LineTo(Histogramme->ImageH->ImageH->Width,300);
     
     
    // Dessin de l'histogramme ...
    Histogramme->ImageH->Canvas->Pen->Color=clRed;
    for(int i=0;i<255; i++) {
    Histogramme->ImageH->Canvas->MoveTo(i+Histogramme->ImageH->ImageH->Left,300);
     
     
     
     Histogramme->ImageH->Canvas->LineTo(i+Histogramme->ImageH->ImageH->Left, 300-PreTraitement->H[i]/100);     
     
      }
     
    Histogramme->ImageH->Show();
     
    }

  8. #8
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    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
     
     // Dessin des axes de l'histogramme
    Histogramme->ImageH->Canvas->Pen->Color=clBlack;
    Histogramme->ImageH->Canvas->MoveTo(Histogramme->ImageH->ImageH->Left,70);
    Histogramme->ImageH->Canvas->LineTo(Histogramme->ImageH->ImageH->Left,300);
     
    Histogramme->ImageH->Canvas->MoveTo(Histogramme->ImageH->ImageH->Left,300);
    Histogramme->ImageH->Canvas->LineTo(Histogramme->ImageH->ImageH->Width,300);
     
     
    // Dessin de l'histogramme ...
    Histogramme->ImageH->Canvas->Pen->Color=clRed;
    for(int i=0;i<255; i++) {
    Histogramme->ImageH->Canvas->MoveTo(i+Histogramme->ImageH->ImageH->Left,300);
     
     
     
     Histogramme->ImageH->Canvas->LineTo(i+Histogramme->ImageH->ImageH->Left, 300-PreTraitement->H[i]/100);     
     
      }
     
    Histogramme->ImageH->Show();
     
    }
    je ne comprends pas cette duplication sur ImageH

  9. #9
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Salut,
    ce n'est pas une duplication de code, si ton TImage est sur la fenêtre Histogramme et qu'il s'appelle ImageH, alors pour dessiner dans ce TImage tu dois bien y accéder par le code Histogramme->ImageH.
    Maintenant il faut faire attention à ce que ton TImage soit assez étendu sur la fenêtre pour afficher toute ton image

  10. #10
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Ne serait-ce pas une histoire de taille du bitmap du TImage ?

    A plus !

  11. #11
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Citation Envoyé par pottiez Voir le message
    Salut,
    ce n'est pas une duplication de code, si ton TImage est sur la fenêtre Histogramme et qu'il s'appelle ImageH, alors pour dessiner dans ce TImage tu dois bien y accéder par le code Histogramme->ImageH.
    je parlais de cette ligne de code par ex:
    Citation Envoyé par kmaniche Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     ...
    Histogramme->ImageH->Canvas->MoveTo(Histogramme->ImageH->ImageH->Left,70);
    ...
    }
    Maintenant il faut faire attention à ce que ton TImage soit assez étendu sur la fenêtre pour afficher toute ton image
    Citation Envoyé par henderson Voir le message
    Salut !

    Ne serait-ce pas une histoire de taille du bitmap du TImage ?

    A plus !
    ImageH n'est pas étendu sur toute la fenêtre, si je mets ce même code dans un bouton de la fenêtre Histogramme "contenant ImageH" le problème ne se pose pas et l'histogramme s'affiche. je ne veux pas cette solution pour mon cas je préfère mettre le code dans un bouton "AfficherHistogramme" de la Forme principale "PreTraitement" qui me permet d'afficher dirrectement l'histogramme comme je l'avais décris précédemment.

  12. #12
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Est-ce que tu as résolu ton problème ?

  13. #13
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    Est-ce que tu as résolu ton problème ?
    non

    je demande est ce que mon problème est clair?

  14. #14
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    cher 123 viva ...

    Ton problème est simple :

    1. Tu crées une Fiche (Form1) principale dans laquelle tu ajoutes un bouton et une image nommée ImageSource
    2. Tu ajoutes une deuxième fiche (Form2) sur laquelle tu ajoutes un TImage nommé Image_Histogramme de dimension :
    Width = pas moins de 260.
    Height = comme tu veux mais qui soit > 100 mais < Width (pour faire joli)

    3. Apartir du bouton que tu as créé dans la fiche principale, tu code le prgramme nécessaire à la création de l'histogramme :

    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Calcul de l'histogramme
    int v[255] =  0 ;
    for(int i = 0 ; i < ImageSource -> Picture -> Height ; i++)
        for(int j = 0 ; j < ImageSource -> Picture -> Width ; j++)
             v[int(ImageSource -> Canvas -> Pixels[j][i]&0xFF)] ++ ;
    4. Toujours dans le code du même bouton, tu traces le contenu du vecteur v dans le canevas de l'image Image_Histogramme de la form2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    ...
    Form2 -> Image_Histogramme -> Canvas ....
    NB: Faire une mise à l'échelle, car le max dans le vecteur peut être supérieur à celui du Height de Image_Histogramme

    5. Enfin il ne te restes plus que afficher la form2

  15. #15
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    cher 123 viva ...
    viva quoi?

    en fait je ne demande pas le calcul de l'histogramme je le fais ultérieurement et il marche très bien et meme ce code marche si je le met dans un bouton ou fonction de la forme2, chose qui gène l'user qui doit d'abord afficher la forme2 puis cliquer sur un bouton pour afficher l'histogramme, pourquoi je n'arrive pas à l'afficher directement en un click à partir de la forme principale puis que le code est bon??

  16. #16
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    >> saadane

    OK, dans ce cas, au lieu de mettre le code dans un bouton de la deuxième fiche, tu le mets directement dans le OnShow de la fiche ? Logique non ...

  17. #17
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    >> saadane
    non, ça ne va pas

    OK, dans ce cas, au lieu de mettre le code dans un bouton de la deuxième fiche, tu le mets directement dans le OnShow de la fiche ? Logique non ...
    je l'ai déjà fais et ça n'a pas marché
    le truc est que BCB m'oblige à faire un évènement OnClick sur la forme appelée pour pouvoir exécuter mon code

  18. #18
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    OK, on reprends dès le début, donnes-nous le programme que tu as fais, principalement celui de la fiche principale et celle de l'histogramme.

  19. #19
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    je calcule l'histogramme en // avec la transformation en niv de gris de l'image couleur chargée
    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
    void __fastcall PreTraitement::NivGrisClick(TObject *Sender)
    {
      Srce = ImageOriginale->Picture->Bitmap;
      Dest=ImageOriginale->Picture->Bitmap;
     int w = Srce->Width   ;
     int h = Srce->Height ;
     
    Dest->Width = w;
    Dest->Height = h;
     
    for(int y = 0; y < h; y++)
        {
        S = (jRgb*)Srce->ScanLine[y];
        D = (jRgb*)Dest->ScanLine[y];
     
     
        for(int x = 0; x < w; x++)
            {
         b = (Byte)( (S[x].Blue + S[x].Green + S[x].Red) / 3 );
     
               //on en profitte pour calculer l'histogramme de l'image en niv de gris
     
          H[b]++;
     
     
            D[x].Blue  = b;
            D[x].Green = b;
            D[x].Red   = b;
          }
        }
     
    ImageOriginale->Repaint();
     ImageOriginale->Picture->SaveToFile("C:\\Gris.bmp");
     
    }
    et voilà le code du bouton avec le quel je dessine l'histogramme
    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
     
    void __fastcall TPreTraitement::AfficherHistogrammeClick(TObject *Sender)
    {
     
     
     // Dessin des axes de l'histogramme
    Histogramme->Canvas->Pen->Color=clBlack;
    Histogramme->Canvas->MoveTo(Histogramme->ImageH->Left,70);
    Histogramme->Canvas->LineTo(Histogramme->ImageH->Left,300);
     
    Histogramme->Canvas->MoveTo(Histogramme->ImageH->Left,300);
    Histogramme->Canvas->LineTo(Histogramme->ImageH->Width,300);
     
     
    // Dessin de l'histogramme ...
    Histogramme->Canvas->Pen->Color=clRed;
    for(int i=0;i<255; i++) {
    Histogramme->Canvas->MoveTo(i+Histogramme->ImageH->Left,300);
     
     
     
     Histogramme->Canvas->LineTo(i+Histogramme->ImageH->Left, 300-PreTraitement->H[i]/100);     
     
      }
     
    Histogramme->Show();
     
    }
    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
    //Déclarations 
     
    Graphics::TBitmap *Srce;
    Graphics::TBitmap *Dest ;
     
    Byte b;
     
    int  h,w;
     
    int H[256];
     
    class jRgb
    {
    public:
    Byte Blue;
    Byte Green;
    Byte Red;
     
    };
     
    jRgb *S;
    jRgb *D;

  20. #20
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Tu devrais peut être analyser ton code à tête reposée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Histogramme->Canvas->MoveTo(Histogramme->ImageH->Left,70);
    Avec la ligne en rouge, tu demande à dessiner sur le canvas de la fiche (form) et en bleu tu lis la position du composant ImageH

    Normalement, le dessin s'effectue directement sur le composant ImageH non ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/01/2011, 13h24
  2. Dessiner une portion d'image dans une autre image
    Par Harry_polin dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 24/11/2009, 13h19
  3. Réponses: 7
    Dernier message: 10/06/2009, 22h29
  4. [BCB6] Mettre dans une TForm une autre TForm.
    Par almisuifre dans le forum C++Builder
    Réponses: 17
    Dernier message: 25/11/2006, 07h08
  5. Réponses: 6
    Dernier message: 31/08/2006, 15h19

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