Problème de transparence bitmap

Problème de transparence bitmap - Delphi/Pascal - Programmation

Marsh Posté le 03-01-2010 à 13:12:58    

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

Citation :

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.

Reply

Marsh Posté le 03-01-2010 à 13:12:58   

Reply

Marsh Posté le 04-01-2010 à 13:19:09    

Plop,
D'apres http://www.delphi3000.com/articles/article_485.asp?SK= il faut indiquer le pixelformat, ce que tu semble faire, mais en commentaire tu dis que c'est du 16 millions de couleurs et plus loin tu dis que ton bitmap est en 256 couleurs!
Ensuite je sais pas si les majuscules sont importantes, mais dans le lien proposé c'est RGB() et toi tu mets rgb()
Il se pourrait également que Canvas.CopyRect  "seul" ne soit pas la bonne méthode ( http://docwiki.embarcadero.com/VCL [...] s.CopyRect )

Reply

Marsh Posté le 04-01-2010 à 20:38:47    

Salut Breizhbugs,
les deux bitmaps sont differents. le premier est le fond en 16 M et le sprite est en 256. tu penses que il peut y avoir incompatibilité ! je vais faire un essai en mettant mon sprite en 16 M egalement et je vais lire l'article.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed