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 :

TImage et transparence


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Par défaut TImage et transparence
    Bonjour

    je cherche avec Bcpp4 (vieux ...) à faire des calques avec des TImage superposés.

    J'ai donc recherché à travailler Transparent de TImage. Et les ennuis ont commencés.

    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
     
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Image1->Transparent=false;
    Image1->Picture->Bitmap->LoadFromFile("Original1.bmp");
    Image2->Transparent=true;
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     
    Graphics::TBitmap* bmp = new  Graphics::TBitmap();
    if (bmp)
    { bmp->Transparent=true;
      bmp->TransparentMode=tmFixed;
      bmp->TransparentColor=clWhite;
      bmp->LoadFromFile("calque02.bmp");
      //Image2->Canvas->StretchDraw(Rect(0,0,Image2->Width, Image2->Height), bmp);
      Form1->Canvas->Draw(0,0,bmp);
      delete bmp;
      bmp=NULL;
      }
    }
    Le code est inspiré de l'aide de Bcpp.
    Dans une Form1, j'ai placé un bouton et deux TImage l'un sur l'autre. Image1 contient une image bmp "de base" et Image2 devrait recevoir une image d'un calque dont la couleur de fond est "transparente" à Image2 ... Image2 a sa propriété Transparent=true;

    Bien entendu ... çà ne marche pas !

    Pour tester j'ai placé deux lignes que je place alternativement en commentaire. Quand la ligne Form1->Canvas->Draw(0,0,bmp); est active, la transparence du bmp marche seulement sur le bouton Button1 qui se trouve sous le bmp tracé, mais pas Image1 qui est masquée. Quand la ligne Image2->Canvas->StretchDraw(Rect(0,0,Image2->Width, Image2->Height), bmp); est activée : bien entendu, on ne voit pas plus Image1.

    Quelqu'un saurait il afficher proprement une image transparente en bitmap au-dessus d'une autre image sans passer par le "truc" du canal alpha par exemple des png ?

    Je remarque que la propriété Transparent est documentée sur TImage et jamais sur TGraphics ou TBitmap. Pourtant, l'aide indique bien que Transparent est aussi un membre de TBitmap .... et le compilateur l'accepte. serait-ce l'indice d'un défaut ?

    Il y a plusieurs discussions sur ce thème. Sur Delphi, les gens prétendent que la transparence entre deux TImage çà passe sans problème. Quelqu'un a t'il une idée sur Bcpp ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Pense que pour un TImage, cela utilise le Pixel inférieur gauche pour connaitre la couleur de transparence d'un BMP

    Pour le chargement d'Image2 par un StrechDraw, ce n'est pas forcément bon avec la transparence, je t'avoue n'avoir jamais essayé préférant utiliser une TPaintBox qui conçu pour l'affichage à la volée

    La plupart joue sur deux TImage chargés depuis un BMP
    Pense aussi à l'ordre des dessins, il peut y avoir de la transparence mais selon l'ordre des Paint tu n'auras pas le même résultat encore une fois avantage à la TPaintBox où l'on maitrise cela beaucoup mieux

    Pour le Draw sur la Form, cela peut compliqué les choses
    Evite d'utiliser Form1 mais plutôt this.

    Citation Envoyé par Phijet Voir le message
    Quelqu'un saurait il afficher proprement une image transparente en bitmap au-dessus d'une autre image sans passer par le "truc" du canal alpha par exemple des png ?
    Tu trouves cela dans Jedi mais pour un si vieux BCB ...
    le TPNGImage est aujourd'hui un standard de la VCL

    Citation Envoyé par Phijet Voir le message
    Je remarque que la propriété Transparent est documentée sur TImage et jamais sur TGraphics ou TBitmap. Pourtant, l'aide indique bien que Transparent est aussi un membre de TBitmap .... et le compilateur l'accepte. serait-ce l'indice d'un défaut ?
    En BCB6, c'est parfaitement documenté

    Indique si l'image recouvre sa zone rectangulaire.

    __property bool Transparent = {read=GetTransparent, write=SetTransparent, nodefault};

    Description

    Utilisez la propriété Transparent pour spécifier que le graphique peut être dessiné en transparence. Certains descendants de TGraphic comme TIcon ou TMetafile étant toujours transparents, l'affectation de la propriété Transparent de ces objets ne change donc pas leur comportement. Par contre, le dessin des TBitmap est affecté par cette propriété. Le composant TImage affecte à cette propriété la valeur de sa propriété Transparent afin d'effectuer le dessin en transparence.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Par défaut
    Il y avait une discussion avec Blondelle qui m'a donné une idée. En recopiant son code, j'ai fait :
    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
     
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Image1->Transparent=false;
    Image1->Picture->Bitmap->LoadFromFile("Original1.bmp");
    Image2->Transparent=true;
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     
    TColor TransparentColorValue = clWhite;
     
    Image2->Canvas->Brush->Color = TransparentColorValue;  //TransparentColor;
    Image2->Transparent = true;
    Image2->Canvas->Pen->Width = 1;
    Image2->Canvas->Pen->Color = clBlack;
    Image2->Canvas->FillRect(Rect(0,0,Image2->Width,Image2->Height));
    Image2->Canvas->MoveTo(10,20);
    Image2->Canvas->LineTo(160,100);
    Image2->Canvas->Brush->Color = clBlue;
    Image2->Canvas->FillRect(Rect(90, 90, 130, 120));
     
     
    }
    Image2 est bien transparente pour son fond qui est blanc et on voit bien Image1 qui porte le fichier bitmap. Le dessin du trait et du rectangle bleu est bien par dessus le fichier bitmap.

    Par contre charger un fichier bmp dans le bitmap associé à Image2 masque encore l'image dans Image1.

  4. #4
    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 Phijet
    Quand tu charge une image tu utilise Picture->Bitmap pour la transparence il faut faire comme ceci
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
         : TForm(Owner)
    {
    Image1->Picture->Bitmap->TransparentColor = clBtnFace;  //Canvas->Pixels[24][24];
    Image1->Picture->Bitmap->TransparentMode = tmFixed;
    Image1->Picture->Bitmap->LoadFromFile("C:\\Users\\home\\Documents\\Images\\Massiv10\\Bitmaps\\Mail\\bossmail.bmp");
    Image2->Transparent=true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Image2->Picture->Bitmap->TransparentColor = clWhite; 
    Image2->Picture->Bitmap->TransparentMode = tmFixed;
    Image2->Picture->Bitmap->LoadFromFile("C:\\Users\\home\\Documents\\Images\\Massiv10\\Bitmaps\\Mail\\busemail.bmp");
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Par défaut
    Merci à Shailat et à Blondelle

    Le code de Blondelle ne marchait pas sur mes images.

    Dans son code j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image2->Picture->Bitmap->PixelFormat=pf24bit;
    après le LoadFromFile dans le Image2.

    Et çà marche parfaitement. Mes images étaient en effet en pf32bits et il semble que BC version 4 n'accepte pas images 32 bits ...

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

Discussions similaires

  1. La propriété Transparent de TImage ne fonctionne pas
    Par randriano dans le forum C++Builder
    Réponses: 8
    Dernier message: 07/02/2007, 14h16
  2. Timage, Jpeg & Transparence
    Par Flow_75 dans le forum C++Builder
    Réponses: 4
    Dernier message: 03/11/2006, 14h30
  3. Comment écrire en mode "transparent" sur un TImage
    Par Invité dans le forum C++Builder
    Réponses: 3
    Dernier message: 26/08/2005, 11h34
  4. Transparence TImage
    Par Franck26 dans le forum C++Builder
    Réponses: 3
    Dernier message: 06/04/2005, 11h45
  5. [Transparent] - Comment dessiner sur 2 TImage ?
    Par TOTO32 dans le forum Langage
    Réponses: 15
    Dernier message: 08/08/2004, 01h06

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