Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1160 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Problème de transparence bitmap

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de transparence bitmap

n°1954551
franckmena​nt
Posté le 03-01-2010 à 13:12:58  profilanswer
 

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.

mood
Publicité
Posté le 03-01-2010 à 13:12:58  profilanswer
 

n°1954772
breizhbugs
Posté le 04-01-2010 à 13:19:09  profilanswer
 

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 )

n°1954969
franckmena​nt
Posté le 04-01-2010 à 20:38:47  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Problème de transparence bitmap

 

Sujets relatifs
probleme de choix dans une base mysql a partir d'une dateProblème hauteur CSS
[JAVA]Probleme affichage adresse memoire[RESOLU] Probleme avec AJAX Star Rating sur IE
Probleme d'affectation de flotteDoxygen (problème avec des noms de variable/de classe)
Problème avec news pour site webProbleme de compatibilite entre IE et Firefox
Probleme vidéo inséré sous Firefox[C] probleme sprintf et pointeur :S
Plus de sujets relatifs à : Problème de transparence bitmap


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR