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

  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 089
    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 089
    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