Salut,
Comment dois je faire pour avoir les coordonnées de n'importe quel pixel dans une TImage?
Version imprimable
Salut,
Comment dois je faire pour avoir les coordonnées de n'importe quel pixel dans une TImage?
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].
Salut,
Je voudrai savoir comment connaître les coordonnées de n'importe quel pixel sur la zone TImage en cliquant dessus.
A+
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
L'événement ButtonDown te donne les coordonnées :roll:Citation:
Envoyé par bahiatoon
Salut,
Peux tu expliquer STP!!Citation:
Envoyé par Mat.M
A+
Code:
1
2
3
4
5 void __fastcall TPagesDlg::Button1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { }
Appuie sur F1 ;-)Citation:
Envoyé par bahiatoon
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 :-)
Bonjour,
A+Citation:
void __fastcall TPagesDlg::Button1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Qu'es qu'il faut mettre ici?????????????????:?
}
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....
Salut bahiatoon:
un petit exemple, sur la Form 1 TImage, 4Tlabel.
le code:
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 //--------------------------------------------------------------------------- #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; } /
Salut à tous,
Merci pour votre aide c'est vraiment sympa:mrgreen:
Mais je n'arrive toujours pas à résoudre le problème:aie:
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 souris8O
J'ai tout essayé (même F1) mais mon programme ne donne toujours rien:cry:
Si vous avez la réponse aidez moi SVP.
A+
La solution pour calculer la distance entre deux pixels ta ete donnee sur ce poste:
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:
1
2 TPoint P1; TPoint P2;
Ca reste applicable sur tout objet disposant d'un OnMouseDown !Code:
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); }
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 :
Voici le contenu du .cpp :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 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}; };
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:
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é } //--
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:
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)); } //--
On suppose Image1 au premier planCode:
1
2 TImage *Image1; TImage *Image2;
On fait passer Image2 au premier plan en dessinant P1 et P2 sur Image2Code:
1
2 P1 = new jPoint(this, Image1->Canvas); P2 = new jPoint(this, Image1->Canvas);
C'est juste pour le "fun" et pour fêter 2007 (donc autant partir d'un bon pied) !Code:
1
2
3 Image2->BringToFront(); P1->ChangeCanvas(Image2->Canvas, true); P2->ChangeCanvas(Image2->Canvas, true);
A plus !
Bonjour Henderson,
WAW!! ton explication est vraiment claire je vais l'essayer tout de suite.
Merci beaucoup:mrgreen:
A+