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

Langage Delphi Discussion :

pas de transparence avec mon bitmap


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 11
    Points
    11
    Par défaut pas de transparence avec mon bitmap
    Bonjour,
    le probleme que j'ai est que je veux afficher mon sprite en mode transparence (couleur noire de mon sprite doit être transparente).
    j'ai repris du code trouvé sur internet que j'ai simplifié pour une question de comprehension. je voulais comprendre le principe utilisé pour afficher un srpite. Le programme affiche une image de fond et un bmp en guise de sprite qui suit la souris quand on actionne le bouton de la souris.
    je l'ai quelque peu modifié pour afficher un BMP en tant que sprite. Tout cela fonctionne très bien sauf la transaprence !
    Où est-ce que je fais une erreur ?

    Merci d'avance pour les explications.

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    unit Udraw;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls;
    type
      TForm1 = class(TForm)
        PaintBox1: TPaintBox;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure PaintBox1Paint(Sender: TObject);
      private
        procedure dessinecurseur;
      end;
    
      Tcurseur = record
         drawing : boolean; // en cours de déplacement
         rr  : trect;            // rectangle position courante
         rro : trect;           // rectangle ancienne position
         RECsprite : Trect;  // le rectangle correspondant a BMPSprite
      end;
    
    var
      Form1: TForm1;
      H, W : integer;             // hauteur et largeur de la paintbox
      BmpFond : Tbitmap;      // bitmap de fond
      BmpMemoire : Tbitmap;  // bitmap memoire pour preparation dessin a afficher
      BMPsprite : Tbitmap;    // le bitmap que je veux deplacer avec la souris
                                     // et qui comporte dans son milieu de la couleur noire
                                     // que je voudrais rendre transparente
      cc : Tcurseur;            // pour la gestion du bitmap BMPSprite
    
    implementation
    {$R *.DFM}
    
    //------------------------------------------------------------
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      H := paintbox1.height;
      W := paintbox1.width;
      cc.drawing := false;
      cc.rr := rect(50, 50, 150, 150); // definition d'un premier emplacement
                                                 // pour le nouveau rectangle
      cc.rro := cc.rr;                       // position courante du spprite devient
                                                 // l'ancienne position
    
      BmpFond := Tbitmap.create;     // bitmap de fond
      BmpFond.width  := W;
      BmpFond.height := H;
      BmpFond.LoadFromFile('fond.bmp');// fond.bmp=500x333 16 millions couleurs
    
      BmpMemoire := tbitmap.create;
      BmpMemoire.assign(BmpFond);      // copie de BmpFond sur BmpMemoire
    
      BMPsprite := Tbitmap.Create;
      BMPsprite.LoadFromFile('bitmap.bmp'); // chargement de l'image du sprite
      BMPsprite.PixelFormat := pf32bit;
      // c'est là que je determine la transparence mais cela ne marche pas.
      // je voudrais que tout le noir de mon sprite devienne transparent
      // j'ai fabriqué ce sprite avec image éditeur de delphi :
      // bitmap.bmp = 100x100 256 couleurs  
      BMPsprite.Transparent := true;
      BMPsprite.TransparentColor := rgb(0,0,0); // couleur noire
    
      cc.RECsprite.Left := 0;
      cc.RECsprite.Top := 0;
      cc.RECsprite.Right := BMPsprite.Width;
      cc.RECsprite.Bottom := BMPsprite.Height;
    
      dessinecurseur;  // affichage du premier sprite à la position de départ
    end;
    //------------------------------------------------------------
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    begin
    form1.paintbox1.Canvas.Draw(0,0,BmpMemoire);
    end;
    //------------------------------------------------------------
    Procedure Tform1.dessinecurseur;
    var
      Runion: Trect;
    begin
      BmpMemoire.canvas.copyrect(cc.rro, BmpFond.canvas,cc.rro);
      BmpMemoire.Canvas.CopyRect(cc.rr,BMPsprite.canvas,cc.RECsprite);
      Unionrect(Runion, cc.rro, cc.rr);
      form1.paintbox1.canvas.copyrect(Runion, BmpMemoire.canvas, Runion);
      cc.rro := cc.rr;
    end;
    //------------------------------------------------------------
    procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    Var
      p : tpoint;
    begin
      p.x := X;  p.y := Y;
      if ptinrect(cc.rr, p) then
      begin
        cc.drawing := true;
        cc.rr := rect(x, y, x+100, y+100); //100 = largeur et hauteur de BMPSprite
      end;
      dessinecurseur;
    end;
    //------------------------------------------------------------
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      IF cc.drawing then
      begin
         cc.rr := rect(x, y, x+100, y+100);
         dessinecurseur;
      end;
    end;
    //------------------------------------------------------------
    procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      IF cc.drawing then
      begin
        cc.rr := rect(x, y, x+100, y+100);
        dessinecurseur;
        cc.drawing := false;
      end;
    end;
    //------------------------------------------------------------
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      BmpFond.free;
      BmpMemoire.free;
      BMPSprite.Free;
    end;
    end.

  2. #2
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    salut,
    c'est surement pas ca mais essaye de gérer tous tes bitmap en transparent=true, tu le met que pour BMPsprite, met le aussi pour BmpMemoire...
    Darkyl, celui qui conduit quand il boit pas .(faudra penser passer le permis )

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    Salut Darkyl,
    j'ai essayé cela aussi = même chose (aucun changement) !

  4. #4
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    moi je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                  with Bitmap do
                begin
                   Transparent := True;
     
                  TransParentColor := clwhite;
                  moteurtemporaire.Canvas. StretchDraw(imagetemp,BitMap);
                   TransparentMode := tmAuto;
                end;
    et cela marche trés bien...
    o pire, change rgb(0,0,0) en clblack et rajoute TransparentMode := tmAuto.
    Peut-être...
    Darkyl, celui qui conduit quand il boit pas .(faudra penser passer le permis )

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 11
    Points
    11
    Par défaut Re Salut
    j'ai été obligé de quitter hier.
    j'ai essayé toutes les choses que tu mentionne = pas de changement
    je ne sais pas ce qui cloche ???

  6. #6
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    dsl, alors pas d'idées, peut-être au niveau de tes librairies s(comme graphics). T'a installé graphic32? Sinon, je vois pas dsl. Si je trouve...
    Darkyl, celui qui conduit quand il boit pas .(faudra penser passer le permis )

  7. #7
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    pour palier à ça, comme j'en avais marre de gerer les bitmap transparent tout moche, j'ai tout simplement abandonné les Bitmap pour les PNG.
    c'est plus jolie, c'est tout aussi rapide et ça fonctionne avec un simple Draw sans parametrage fastidieux.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  8. #8
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Citation Envoyé par Darkyl Voir le message
    moi je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        (...)
        TransParentColor := clwhite;
        (...)
        TransparentMode := tmAuto;
        (...)
    Si on met tmAuto, la couleur de transparence est le premier pixel de l'image (généralement le point inférieur gauche), et ça ne sert donc à rien de définir TransparentColor. Il faut mettre TransparentMode := tmFixed;

  9. #9
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    Merci 10_GOTO_10..

    Je ne savais pas pour TransparentMode et comme mes premiers pixels sont blanc, je n'ai pas eu d"erreur... Merci encore.

    Dr.Who, les png ne sont pas limité par rapport au bmp? (couleur, taille...)...

    Aprés, utopiquement, répondre à un problème en changeant la solution sans trouver la faille.... Où sont les tenors de déveleppez.com ...

    " Programmer, c'est écrire une ligne et programmer."
    Darkyl, celui qui conduit quand il boit pas .(faudra penser passer le permis )

Discussions similaires

  1. mon CV pdf ne veut pas s'ouvrir avec mon php
    Par misshelen dans le forum Langage
    Réponses: 2
    Dernier message: 16/01/2009, 11h56
  2. [DevIL] Pas de transparence avec les .dds
    Par Sacha999 dans le forum DevIL
    Réponses: 11
    Dernier message: 04/04/2007, 14h19
  3. Réponses: 1
    Dernier message: 25/01/2007, 18h19
  4. mon netbeans n'arrete pas de merder avec swing
    Par alain57 dans le forum NetBeans
    Réponses: 2
    Dernier message: 08/11/2006, 11h35
  5. Delete ne fonctionne pas avec mon gridview
    Par NicoNGRI dans le forum ASP.NET
    Réponses: 2
    Dernier message: 26/10/2006, 08h52

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