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 par dessus une image


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut Dessiner par dessus une image
    Bonjour,

    je cherche à pouvoir dessiner une ligne au dessus d'une image (photo de type jpeg), les 2 points de cette ligne devant être définis par l'utilisateur.

    Pour tester, j'ai posé un TImage sur une fiche, ajouter jpeg.hpp dans le header et choisi une image avec l'inspecteur d'objet.

    Ensuite, je gère la méthode de dessin de la ligne sur l'évènement OnMouseDown des TImage.

    Voici mon 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
     
    void __fastcall TForm1::ImageMouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     if (first)
     {
      PointPrec.x = X;
      PointPrec.y = Y;
     
      first = false;
     }
     else
     {
      TPoint PointSuiv;
      PointSuiv.x = X;
      PointSuiv.y = Y;
     
      ImageSup->Picture->Bitmap->Canvas->Pen->Color = clRed;
      ImageSup->Picture->Bitmap->Canvas->Pen->Width = 10;
      ImageSup->Picture->Bitmap->Canvas->Pen->Style = psSolid;
     
      ImageSup->Picture->Bitmap->Canvas->MoveTo(PointPrec.x,PointPrec.y);
      ImageSup->Picture->Bitmap->Canvas->LineTo(PointSuiv.x,PointSuiv.y);
     
      first = true;
     }
    }
    Nb: je m'excuse pour l'absence de commentaires...

    Ce que je ne comprends pas, c'est que quand je teste mon code, je passe bien où il faut (vérifier en mode debbogage) mais je n'ai rien qui apparait sur ma fiche (pas de ligne rouge). De plus, la photo que j'affiche dans le TImage disparait .

    Je ne comprends vraiment pas ce qui se passe.

    Si quelqu'un peut m'aiguiller...

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

    Peut-être qu'il faut rajouter :

    compte tenu que les opérations de dessin s'effectuent sur le bitmap.

    A plus !

  3. #3
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut
    Citation Envoyé par henderson
    Salut !

    Peut-être qu'il faut rajouter :

    compte tenu que les opérations de dessin s'effectuent sur le bitmap.

    A plus !
    Pas mieux

    Aucune différence avec que sans...

    J'ai essayé ma méthode directement sur le canvas et cela fonctionne...
    Cela ne vient donc pas de la méthode mais de la cible (TImage)

  4. #4
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    Peut être que cela vient du fait que tu utilises une image JPeg , alors que ton code attaque la bitmap...

    Peut être peut tu essayer de traiter plutot le Graphic de Picture->Image->Graphic ....

  5. #5
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut
    Citation Envoyé par Djob
    Peut être que cela vient du fait que tu utilises une image JPeg , alors que ton code attaque la bitmap...

    Peut être peut tu essayer de traiter plutot le Graphic de Picture->Image->Graphic ....
    Ca marche peut-être mais je ne connais, et ne trouve, aucune méthode de dessin sur le canvas à partir d'un TGraphic...

  6. #6
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    C'est normal il n'y a en pas (j'avais oublié )
    peut être qu'une solution serait de passer par une Bitmap temporaire.ou une conversion, après ça dépend de ce que tu veux faire exactement...

    mais si tu charges une image non bitmap danas une TImage , elle est stockée dans Graphic et si tu touches à bitmap après, l'image dans graphic est libérée.

  7. #7
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut
    Mon but est de pouvoir mesurer des données sur la photo.

    L'utilisateur précise le début et la fin de la mesure et je dois en déduire une distance approximative réelle.

    Je cherche donc à déssiner une sorte de règle sur l'image pour bien montrer ce qui est mesuré.

    J'ai également essayé de déssiner cette ligne sur un deuxième TImage se trouvant au-dessus de celle affichant la photo mais là, pareil, je n'ai toujours rien...

    Correction: j'arrive à avoir mes lignes sur la deuxième image mais je me retrouve avec un fond blanc sur le TImage me servant à dessiner les traits.
    Si quelqu'un sait comment je peux rendre cette zone transparente (nb: Style de pinceau à bsClear et propriété Transparent à true)...

  8. #8
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    Je ne sais pas comment la rendre transparente...
    à part en travaillant directement avec une paintbox par dessus ( le defaut étant que l'image n'est pas persistante et qu'il faut alors la sauver )....

    sinon si tu veux travailler avec une TImage par dessus,
    tu peux peut être simplement recopier l'image en arrière plan dans ta nouvelle image :

    (en supposant que Image1 et Image2 soit dela même taille)

    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
    void __fastcall TForm1::btnLoadImage2Click(TObject *Sender)
    {
            Graphics::TBitmap *bmp  = new Graphics::TBitmap();
            bmp->Width=Image2->Width;
            bmp->Height=Image2->Height;
     
            //conversion
            bmp->Assign(Image1->Picture->Graphic);
     
            //dessin dessus
            bmp->Canvas->Pen->Color = clRed;
            bmp->Canvas->Brush->Color = clRed;
            bmp->Canvas->MoveTo(5,5);
            bmp->Canvas->LineTo(15,15);
            bmp->Canvas->Rectangle(10,10,50,50);
            Image2->Picture->Assign(bmp);
    }
    le probleme est que si tu veux redessiner à nouveau quelque chose à la suite il faut aussi sauver ce qui vient d'etre dessiné....

    c'est pas forcement ce que tu cherches mais c'est tout ce qui me vient à l'esprit pour l'instant ...
    peut être que ça pourra t'aiguiller....

  9. #9
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut


    Ca marche!!!

    Merci Djob

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Par défaut
    Je reouvre ce topic car c'est un probleme recurrent et qu'il doit exister une methode simple.

    J'ai une Image1 dans laquelle je charge par default un .bmp Si je souhaite rajouter des dessins dessus, pas de pb tant que je suis sur une zone ou le bitmap est. Cependant, si je dessine dans une zone de la Timage ou le bitmap n'est pas affiche (car plus petit), rien n'est visible.

    Si j'utilise la solution radical du Picture=NULL, je retrouve une rectangle blanc a la place de mon TImage et je peux ensuite faire des dessins a loisir sur la dite surface.

    Toutes les methodes repaint, refresh, update, etc n'y change rien. Le pb semble donc venir de l'incompatibilite entre les bitmap et le format builder...
    J'ai donc essaye de virer la palette specifique du bitmap... mais on perd l'image. Ce qui est tout de meme bete puisque l'idee c'est de virer la specificite de l'image et de garder le contenu du canevas.

    En 1an... qq1 a-t-il simplement trouver qq chose a ce sujet?

    edit : pb pas resolu dans ce cadre

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

Discussions similaires

  1. Afficher du texte area par dessus une image
    Par Battosaiii dans le forum Composants
    Réponses: 3
    Dernier message: 14/12/2005, 01h35
  2. Ecrire par dessus une image?
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 11/12/2005, 16h37
  3. swf par dessus une image
    Par deubal dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 17/11/2005, 14h23
  4. Réponses: 3
    Dernier message: 31/10/2005, 16h47

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