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 :

coordonnées d'un pixel


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut coordonnées d'un pixel
    Salut,

    Comment dois je faire pour avoir les coordonnées de n'importe quel pixel dans une TImage?

  2. #2
    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
    Si tu pars de la gauche vers la droite et du haut vers le bas. Le pixel 1 est à [0, 0], le pixel 2 est à [1, 0] et ainsi de suite. En considérant [x, y].

  3. #3
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut
    Salut,

    Je voudrai savoir comment connaître les coordonnées de n'importe quel pixel sur la zone TImage en cliquant dessus.

    A+

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    TImage est un composant qui englobe une image comme la dénomination le suggère.
    Le mieux c'est d'adresser directement le canevas sur lequel la TPicture est affichée :TCanvas :: Pixels.
    sinon en passant par le HDC fourni par TPicture
    Citation Envoyé par bahiatoon
    Salut,
    Je voudrai savoir comment connaître les coordonnées de n'importe quel pixel sur la zone TImage en cliquant dessus.
    A+
    L'événement ButtonDown te donne les coordonnées

  5. #5
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut
    Salut,
    Citation Envoyé par Mat.M
    L'événement ButtonDown te donne les coordonnées
    Peux tu expliquer STP!!
    A+

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TPagesDlg::Button1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    
    }

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Citation Envoyé par bahiatoon
    Salut,

    Peux tu expliquer STP!!
    A+
    Appuie sur F1 ;-)
    Entraines toi à utiliser l'aide lorsque tu te poses une question concernant une classe, un élement ou un évenement de C++ Builder !
    Tu veras ça aide beaucoup :-)

  8. #8
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut
    Bonjour,
    void __fastcall TPagesDlg::Button1MouseDown(TObject *Sender,
    TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    Qu'es qu'il faut mettre ici?????????????????
    }
    A+

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    X et Y, paramètres de la méthode que tu donnes ici, te fournissent les coordonnées du clic sur l'image.

    Après tu en fais ce que tu veux....

  10. #10
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut bahiatoon:
    un petit exemple, sur la Form 1 TImage, 4Tlabel.
    le code:
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    // ici on ecrit le texte X
    Label1->Caption = "X";
    // ici on ecrit la coordonnee X
    Label2->Caption = X;
    // ici on ecrit le texte Y
    Label3->Caption = "Y";
    // ici on ecrit la coordonnee Y
    Label4->Caption = Y;
    }
    /

  11. #11
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut
    Salut à tous,

    Merci pour votre aide c'est vraiment sympa

    Mais je n'arrive toujours pas à résoudre le problème

    Je vais vous expliquer ce que je veux faire:
    J'ai une image et je veux calculer la distance entre n'importe quels deux points (pixels) de cette image, je voudrai choisir ces deux pixels en cliquant dessus avec la souris

    J'ai tout essayé (même F1) mais mon programme ne donne toujours rien

    Si vous avez la réponse aidez moi SVP.

    A+

  12. #12
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    La solution pour calculer la distance entre deux pixels ta ete donnee sur ce poste:

  13. #13
    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 !

    Globalement, on peut se servir de l'événement OnMouseDown et jouer sur le bouton (gauche pour P1 et droite pour P2, par exemple):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TPoint P1;
    TPoint P2;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    if(Button == mbLeft)  P1 = Point(X,Y);
    if(Button == mbRight) P2 = Point(X,Y);
    double Distance = hypot(P2.x - P1.x, P2.y - P1.y);
    //Echo dans la barre de titre de la form... par exemple !!
    Caption = FloatToStr(Distance);
    }
    Ca reste applicable sur tout objet disposant d'un OnMouseDown !

    S'il faut représenter ces deux points, dans ce cas on a intérêt à modéliser un point sachant se dessiner sur un canvas !
    On peut dériver de TComponent, juste pour s'affranchir de la destruction manuelle de l'objet :

    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
    class jPoint : public TComponent
    {
    private :
    TCanvas *FCanvas;
    TPoint FPos;
    bool FFlag;
     
    protected:
    //méthode pour mémoriser la position et qui va aussi le dessiner...
        void __fastcall SetPos(TPoint P);
     
    public :
    //Constructeur
        __fastcall jPoint(TComponent *Owner, TCanvas *Canvas);
    //Destructeur
        __fastcall ~jPoint();
    //Méthode pour dessiner le point
        void __fastcall Draw();
    //Méthode poour changer le canvas et dessiner le point si nécessaire
        void __fastcall ChangeCanvas(TCanvas *Canvas, bool Flag);
    //Méthode renvoyant la distance entre deux points (entre lui-même et Target)
        double __fastcall Distance(jPoint *Target);
    //Cette propriété permet de gérer la position du point et son affichage lors d'un write
        __property TPoint Pos = {read=FPos, write=SetPos};
     
    };
    Voici le contenu du .cpp :

    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
    #include <math.h> //pour hypot
     
    __fastcall jPoint::jPoint(TComponent *Owner, TCanvas *Canvas)
        :TComponent(Owner)
    {
    FCanvas = Canvas;
    FFlag = false;
    }
    //--
     
    __fastcall jPoint::~jPoint()
    {
    }
    //--
     
    void __fastcall jPoint::Draw()
    {
    FCanvas->Pen->Style = psSolid;
    FCanvas->Pen->Color = clBlack;
    FCanvas->Pen->Mode = pmNot;
    //On opte pour un petit motif en forme de croix
    FCanvas->MoveTo(FPos.x - 4, FPos.y);
    FCanvas->LineTo(FPos.x + 5, FPos.y);
    FCanvas->MoveTo(FPos.x, FPos.y - 4);
    FCanvas->LineTo(FPos.x, FPos.y + 5);
    }
    //--
     
    void __fastcall jPoint::ChangeCanvas(TCanvas *Canvas, bool Flag)
    {
    FCanvas = Canvas;
    FFlag = Flag;
    if(Flag) Draw();
    }
    //--
     
    double __fastcall jPoint::Distance(jPoint *Target)
    {
    double n = 0.0;
    if(Target != NULL)
        {
        n = hypot(Target->FPos.x - FPos.x, Target->FPos.y - FPos.y);
        }
    return n;
    }
    //--
     
    void __fastcall jPoint::SetPos(TPoint P)
    {
    if(FFlag) Draw(); //effacer l'ancienne position
    FPos = P; //nouvelle position
    Draw(); //dessiner la nouvelle position
    FFlag = true; //il est de fait dessiné
    }
    //--
    Une fois que c'est fait, ce n'est plus à faire et l'usage va en simplifier le code (ici et dans d'autres programmes) :

    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
    jPoint *P1;
    jPoint *P2;
     
    //--
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    P1 = new jPoint(this, Canvas);
    P2 = new jPoint(this, Canvas);
    }
    //--
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    if(Button == mbLeft)  P1->Pos = Point(X,Y);
    if(Button == mbRight) P2->Pos = Point(X,Y);
    Caption = FloatToStr(P1->Distance(P2));
    }
    //--
    En ce qui concerne la méthode ChangeCanvas du jPoint, elle n'est intéressante que lorsque l'on a deux images superposées, l'une étant au premier plan.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TImage *Image1;
    TImage *Image2;
    On suppose Image1 au premier plan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    P1 = new jPoint(this, Image1->Canvas);
    P2 = new jPoint(this, Image1->Canvas);
    On fait passer Image2 au premier plan en dessinant P1 et P2 sur Image2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Image2->BringToFront();
    P1->ChangeCanvas(Image2->Canvas, true);
    P2->ChangeCanvas(Image2->Canvas, true);
    C'est juste pour le "fun" et pour fêter 2007 (donc autant partir d'un bon pied) !

    A plus !

  14. #14
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut
    Bonjour Henderson,

    WAW!! ton explication est vraiment claire je vais l'essayer tout de suite.

    Merci beaucoup

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/02/2009, 22h23
  2. Coordonnés image en pixels dans Excel
    Par House MD dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/08/2008, 10h13
  3. Récupérer les coordonnées d'un pixel dans une image
    Par amine52002 dans le forum Langage
    Réponses: 1
    Dernier message: 30/06/2008, 14h52
  4. Coordonnées image en pixels dans Excel
    Par ucfoutu dans le forum Contribuez
    Réponses: 0
    Dernier message: 19/06/2008, 08h29
  5. Transposer coordonnées GPS en pixels XY
    Par devroot dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 01/12/2007, 08h23

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