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

API, COM et SDKs Delphi Discussion :

GDI+ problème de transparence


Sujet :

API, COM et SDKs Delphi

  1. #1
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut GDI+ problème de transparence
    Bonjour,

    Cela fait un moment que je galère pour obtenir de la semi-transparence lors de l'utilisation d'une Brush contenant une Texture. Avec le code suivant je trace d'abord une ellipse avec une Brush où la Texture est rendue en Opaque et ensuite une deuxième ellipse avec une Brush où la Texture est déclarée Semi-Transparente via une ColorMatrix et un ImageAttributes mais cette deuxième ellipse ne s'affiche pas ! :
    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
    28
     procedure TfrmGen.Button2Click(Sender: TObject);
    const ColMatrix: TGPColorMatrix =
      ((1.0, 0.0, 0.0, 0.0, 0.0),
        (0.0, 1.0, 0.0, 0.0, 0.0),
        (0.0, 0.0, 1.0, 0.0, 0.0),
        (0.0, 0.0, 0.0, 0.5, 0.0),   //<- 0.5 pour la semi-transparence
        (0.0, 0.0, 0.0, 0.0, 1.0));
    var
      graph: IGpGraphics;
      imgTexture: IGPImage;
      OpaqueBrush, SemiTransBrush: IGPTextureBrush;
      IAttr: IGPImageAttributes;
    begin
      graph := TGPGraphics.Create(imageFond.Picture.Bitmap.Canvas);
      imgTexture:=TGPImage.Create('E:\D_Fi_img\Texture_Bleue.bmp');
    
      // Affichage Ellipse avec Texture Opaque : OK : marche
      OpaqueBrush := TGPTextureBrush.Create(imgTexture);
      graph.FillEllipse(OpaqueBrush, 35, 45, 65, 30);
      imageFond.repaint;
    
      // Affichage Ellipse avec Texture Semi-Transparente : NOK : ne marche pas !!!
      IAttr := TGPImageAttributes.Create;
      IAttr.SetColorMatrix(ColMatrix);
      SemiTransBrush := TGPTextureBrush.Create(imgTexture, MakeRect(0, 0, 30, 30), IAttr);
      Graph.FillEllipse(SemiTransBrush, 86, 45, 45, 30);
      imageFond.repaint;
    end;
    Où est l'erreur ? Comment obtenir un rendu Semi-Transparent avec une Brush Texturée ? S.V.P.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Ce genre de transformation est-il supporté sur une image qui n'est pas à la base 32 bits ?
    J'essayerais avec un png 32 bits.

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Bonjour,

    A Andnotor :
    Ce genre de transformation est-il supporté sur une image qui n'est pas à la base 32 bits ?
    J'essayerais avec un png 32 bits.
    OK, je vais essayer avec un png 32 bits mais mon test précédent portait sur la conversion d'un Bmp 32 bits vers un png.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Re-bonjour,

    Bon, j'ai essayé avec la texture d'un png 32 bits mais je n'obtiens pas la semi-transparence souhaitée. !!!???

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Bon, j'ai fait un essai et c'est un peu tordu

    Ton image de remplissage n’apparaît pas parce qu'elle est moins large que 86 ou moins haute que 45

    ...

    • Le remplissage n'est pas en mode Tile par défaut si on passe par un IGPImageAttributes. Il l'est par contre si on ne définit pas d'attributs ! La texture n'est donc pas répétée et l'ellipse ne contient qu'un élément.
    • Le premier élément est placé au point 0,0 du DC et non le point d'origine de l'ellipse. Si tu la déplaces en 0,0, tu verras ta texture. Là, elle est juste hors-champ.


    Pour le remplissage complet, il faut ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Attr.SetWrapMode(WrapModeTile);
    A noter que ça fonctionne aussi avec une image autre qu'en 32 bits

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Bonjour,

    A Andnotor : Mille fois merci, avec SetWrapMode(WrapModeTile) ça marche enfin.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

Discussions similaires

  1. [ImageList] problème de transparence
    Par Rayek dans le forum Delphi
    Réponses: 7
    Dernier message: 19/05/2006, 11h12
  2. Réponses: 13
    Dernier message: 01/12/2005, 05h34
  3. Réponses: 5
    Dernier message: 18/03/2005, 20h10
  4. [DX9] [Debutant] Problème de transparence :(
    Par SekYo dans le forum DirectX
    Réponses: 5
    Dernier message: 10/09/2004, 14h19
  5. Réponses: 8
    Dernier message: 06/07/2004, 18h30

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