Cadre carré dans un TShape [Résolu]

ender27 7 Messages postés mercredi 5 mars 2008Date d'inscription 2 juin 2008 Dernière intervention - 27 mai 2008 à 18:06 - Dernière réponse : ender27 7 Messages postés mercredi 5 mars 2008Date d'inscription 2 juin 2008 Dernière intervention
- 30 mai 2008 à 12:47
Bonjour,
J'ai actuellement un problème pour dessiner des carré sur un TShape.

Entrée : image noir avec des pixels blancs (Les coordonnées de chaque pixels blancs sont rentrés dans un tableau).
Sortie : image noir toujours avec des pixels blancs, mais ces pixels blancs doivent être entourés d'une bordure carré de coté RayonFiltre.

Mon problème se situe sur le morceau de code surligné en rouge.
Je n'arrive pas à placer les carré autour de mes pixels blancs car je ne sais pas par quoi remplacer : random(Shape1.Width et Height).
J'ai déjà calculé mes positions X1,Y1 et X2,Y2 (X1=l, Y1=m, X2=n, Y2=p) pour utiliser le CreateRectRgn.

SVP aidez moi

Voici ma procédure (j'ai déjà pris un bout de code sur ce site) :

procedure TForm1.decoupage_buttonClick(Sender: TObject);
var
   i,g,j,l,m,n,p:integer;  Brush : HBRUSH;  DC : HDC;  CoordCanvas : Tpoint;  CoordDC : Tpoint;
begin
     if not EnCours then
     begin
          g:=0;
          for i:=0 to imConvertie.Picture.Width-1 do
              for j:=0 to imConvertie.Picture.Height-1 do
                          if imConvertie.Canvas.Pixels[i,j]=1 then
                          begin
                               Tableau_centre_antibiotique[g,0]:=i;   //on rentre les coordonnées des points blancs dans le 
                               Tableau_centre_antibiotique[g,1]:=j;   //tableau
                               with Regions[g] do
                               begin
                                    // On récupère les coordonnées Canvas de la forme
                                    CoordCanvas.X := Shape1.Left;
                                    CoordCanvas.Y := Shape1.Top;


                                    // On les convertit en coordonnées écran
                                    CoordDC := ClientToScreen(CoordCanvas);


                                    // On leur ajoute ensuite les coordonnées du coin haut gauche de la fiche (F)
                                    // Ce qui nous donne la position du TShape par rapport au coin (F)
                                    CoordDC.X := CoordDC.X - Form1.Left;
                                    CoordDC.Y := CoordDC.Y - Form1.Top;


                                    l:=Tableau_centre_antibiotique[g,0]-RayonFiltre;
                                    m:=Tableau_centre_antibiotique[g,1]-RayonFiltre;
                                    n:=imConvertie.Picture.Width - Tableau_centre_antibiotique[g,0] - RayonFiltre;
                                    p:=imConvertie.Picture.Height - Tableau_centre_antibiotique[g,1] - RayonFiltre;
                                   
                                    // On crée les regions en tenant compte de l'origine du TShape
                                    // en coordonnées "DC" et de sa taille
                                    Handle:=CreateRectRgn ( CoordDC.X + random(Shape1.Width)
                                                          , CoordDC.Y + random(Shape1.Height)
                                                          , CoordDC.X + random(Shape1.Width)
                                                          , CoordDC.Y + random(Shape1.Height)
                                                          ) ;


                                    Couleur := RGB(255,0,0); //pour faire un cadre de couleur rouge


                                    // Ici on récupère le "device context" de la fiche principale
                                    // (le DC sous windows représente à peu de chose près le canvas sous delphi)
                                    DC := GetWindowDC(Form1.Handle);


                                    // création d'une brosse pour dessiner à la couleur de la region
                                    Brush := CreateSolidBrush(Couleur);


                                    // Remplissage de la région
                                    //FillRgn(DC,Handle,Brush);   //pour remplir la région d'une couleur
                                    FrameRgn(DC,Handle,Brush, 1, 1);  //pour faire un cadre


                                    // Suppression des divers objets créés
                                    DeleteObject(Brush);
                                    ReleaseDC(Handle,DC);
                                    DeleteObject(Handle);
                               end;
                               g:=g+1;
                          end;  end;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>




 
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
ender27 7 Messages postés mercredi 5 mars 2008Date d'inscription 2 juin 2008 Dernière intervention - 30 mai 2008 à 12:47
3
Merci
Ok, c'est bon.
Trouvé

j'avais fait une erreur au niveau de mes valeurs n et p. Et il faut faire deux regles de trois pour transformer les coordonnées de mon image (ex taille : 640*480) en coordonnée TShape.

Voici la partie modifiée :

                                    l:=(Tableau_centre_antibiotique[g,0]-RayonFiltre);
                                    m:=(Tableau_centre_antibiotique[g,1]-RayonFiltre);
                                    n:=(Tableau_centre_antibiotique[g,0]+RayonFiltre);
                                    p:=(Tableau_centre_antibiotique[g,1]+RayonFiltre);


                                    //regle de trois pour trouver le pourcentage que reprente une image en 640*480 par rapport
                                    //a la taille du TShape.
                                    z:=(imConvertie.Picture.Width*100) div Shape1.Width;
                                    y:=(imConvertie.Picture.Height*100) div Shape1.Height;


                                    // On crée les regions en tenant compte de l'origine du TShape
                                    // en coordonnées "DC" et de sa taille
                                    Handle:=CreateRectRgn ( CoordDC_finale.X +(l*100) div z  //coordonnée pour ecrire dans le TShape + regle de trois pour
                                                          , CoordDC_finale.Y +(m*100) div y  //trouver les pourcentage que represente chaque coordonnee du centre
                                                          , CoordDC_finale.X +(n*100) div z  //par rapport aux dimensions du TShape
                                                          , CoordDC_finale.Y +(p*100) div y
                                                          ) ;

A plus.

Merci ender27 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de ender27

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.