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 :

Effacer Canvas d'un TImage


Sujet :

C++Builder

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 40
    Points
    40
    Par défaut Effacer Canvas d'un TImage
    Bonsoir à tous,
    j'ai un petit probléme pour effacer un rectangle que je dessine sur le canvas d'une TImage.

    Je vous donne le code pour bien comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Image->Canvas->Brush->Style = bsClear;
            Image->Canvas->Pen->Style = psDot;
            Image->Canvas->Pen->Color = clBlue;
            Image->Canvas->Rectangle(0,0, Image->Width, Image->Height);
    Donc pas de probléme pour faire apparaitre le rectangle, mais aprés j'ai besoin de le faire disparaitre. Et ça j'y arrive pas. Je pense que c'est une fonction du canvas de type canvas->clear, mais impossible de trouver.

    Si quelqu'un à une idée...

    Merci pour la lecture et bonne fin de soirée.

  2. #2
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Salut,

    (Normalement on travaille sur Image->Picture->Bitmap->Canvas et non sur Image->Canvas)

    si tu veux effacer un rectangle que tu viens de dessiner sur une image et retrouver les pixels originaux de l'image, c'est pas possible excepté si tu conserve un double de ton image à quelque part.

    Si tu veux effacer le rectangle et toute l'image (remplir de blanc toute l'image) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // pour définir la zone à remplir de blanc
    TRect area = Rect(0, 0, Image->Picture->Bitmap->Width, Image->Picture->Bitmap->Height);
     
    // On défini la couleur de remplisasge ou cmBlackness pour remplir de noir
    Image->Picture->Bitmap->Canvas->CopyMode = cmWhiteness; 
    // on remplit de blanc (ou de noir) la zone définie par area
    Image->Picture->Bitmap->Canvas->CopyRect(area, Image->Picture->Bitmap->Canvas, area);
    // on ré-initialize la valeur de CopyMode
    Image->Picture->Bitmap->Canvas->CopyMode = cmSrcCopy;
    Sinon si tu veux par exemple faire une zone de sélection rectangulaire sur l'image, je te conseille d'utiliser un TShape. Normalement, il y a une méthode de Canvas pour faire une zone de sélection rectangulaire en pointillé (mais c'est pas pratique). Donc tu places un TShape sur ton image ... comme ça tu peux avoir un rectangle sur ton image.

    A+

    Flo.

  3. #3
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Bon allez je combats ma flemme

    Si tu veux faire un rectangle situé au point (20; 30) de dimension (150; 200), tu fais une recopie de cette partie de l'image originale vers un bitmap temporaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TRect area_src = Rect(20, 30,  150, 200)
    TRect area_dst = Rect(0, 0,  150, 200)
     
    Graphics::TBitmap * copy = new Graphics::TBitmap();
    copy->Width = area_dst->Width;
    copy->Height = area_dst->Height;
    copy->PixelFormat = Image->Picture->Bitmap->PixelFormat;
    copy->Canvas->CopyMode = cmSrcCopy;
    copy->Canvas->CopyRect(area_dst, Image->Picture->Bitmap->Canvas, area_src);
    Puis tu traces ton rectangle.

    Et ensuite pour enlever ton rectangle, tu recopies la copie dans l'image originale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Image->Picture->Bitmap->Canvas->CopyMode = cmSrcCopy;
    Image->Picture->Bitmap->Canvas->CopyRect(area_src, copy->Canvas, area_dst);
    Voila. Comme ça le rectangle a disparu de l'image originale.

    Mais c'est pas très "optimisé" comme façon de faire.... à la rigueur utiliser la fonction "bitblt" pour accélèrer les 2 recopies.

    Sinon ma méthode avec les TShapes.

    A+

    Flo.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 40
    Points
    40
    Par défaut
    Et Ben ça c'est une réponse bien compléte, je crois que tu as fait tour de la question.
    Je vais tester ça ce soir.

    Je n'ai plus qu'a te dire merci, une fois de plus Flo.

  5. #5
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Ah ben tiens je crois que j'ai fait une erreur dans mon code, hier.

    c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRect area_src = Rect(20, 30,  20 + 150, 30 + 200) ;
    et non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRect area_src = Rect(20, 30,  150, 200)
    (puis j'avais aussi oublié les point-virgules aussi ).

    Il me semble que Rect prend en effet en paramètres les valeurs left, top, right et bottom et non pas left, top, width et height.

    Tu veux faire quoi au fait ? Remplir l'image de blanc ou remettre les pixels originaux d'avant le dessin du rectangle ?

    A+

    Flo.

  6. #6
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 40
    Points
    40
    Par défaut
    Je t'explique rapidement :
    Sur mon application j'ai un zone sur laquelle je mets des images. Ensuite, je veux pouvoir sélectionner les images de façon indépendante. Donc pour faire apparaitre la sélection, j'entour l'image d'un rectangle bleu.

    Donc l'image est toujours visible mais entouré de bleu.

    Sinon, je conserve une copie de l'image. Je vais donc faire comme tu m'as dis et recopier mon image.

    Je vais essayer ça ce soir.

    Merci, A+.

  7. #7
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Salut,

    au vu de tes explications, je te conseillerais une nouvelle méthode :

    - tu places chaque image dans un panel au point de coordonnées (left=2; top=2) avec des dimensions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    panel->Height = image->Height + 4;
    panel->Width = image->Width + 4;
    Ca fait un "bord" d'image d'épaisseur 2.

    La couleur du panel est celle du fond de ta form.

    Et quand tu sélectionnes une image son panel voit sa couleur passer au bleu. L'image est ainsi sélectionnée.

    Quand elle est désélectionnée, la couleur du panel redevient celle du fond de ta form.

    C'est une méthode beaucoup plus adaptée à ton problème que de dessiner sur l'image.

    A+

    Flo.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 40
    Points
    40
    Par défaut
    OK, c'est vrai que vu sous cet angle, ça aurait pas mal simplifié les choses.
    Là ça fonctionne (enfin) donc je vais garder ton idée de Panel en stock pour quand je serais motiver à faire les modifs. Car rajouter des panels implique pas mal de chose dans mon appli, c'est pas aussi simple que ce que j'ai décris (il y a des dépalcements, des chevauchements d'images ect...).

    Sinon, tu as écris
    Normalement on travaille sur Image->Picture->Bitmap->Canvas et non sur Image->Canvas
    Es que tu pourrais m'expliquer pourqoi? C'est juste un principe ou c'est de l'optimisation?

    Merci encore de passer du temps pour répondre à toutes mes questions.

    A+.

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 30/05/2014, 16h06
  2. Dessiner puis effacer par dessus un TImage
    Par jackvpt dans le forum Composants VCL
    Réponses: 5
    Dernier message: 07/02/2011, 20h09
  3. Redimensionner le canvas d'un timage
    Par Bernard Martineau dans le forum Delphi
    Réponses: 4
    Dernier message: 15/05/2006, 16h49
  4. Pb affichage du canvas dans une TImage
    Par Tango dans le forum Composants VCL
    Réponses: 28
    Dernier message: 11/10/2005, 13h57

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