TImageList, TImage et Transparence

Résolu
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 13 sept. 2007 à 19:00
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 16 sept. 2007 à 22:12
Bonsoir,

J'ai un soucis de transparence, voila le bazar :

Je pose une TImage, je vais peindre dessus grace au .Canvas
Je pose un TImageList. Elle contient une image 25x25, représentant un lapin ( super hein !) et il est entouré de clFushia. Cette couleur est donc une couleur de transparence.
Si je l'ouvre dans un TImage avec Transparent := True; nous n'auront que le lapin et pas de clFushia.
Mais avec Image1.Canvas.Draw(0,0,fBmp); mon lapin apparait entouré de blanc.
Pourquoi ? Et comment y remédier ? Merc

voila un bout de code rapide :

Procedure TForm1.MyRabbit;
var
fBmp: TBitmap;
begin
fBmp := TBitmap.Create;
ImageList1.GetBitmap(0,fBmp);
Image1.Canvas.Draw(0,0,fBmp);
fBmp.Free;
end;

14 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
14 sept. 2007 à 00:37
moi je me prend plus la tete avec les bitmaps transparent qui, ne sont carrement pas prevus pour cela, et même si il en sont pourvus, ça marche tellement mal et le rendus est tellement pourris digne des 70's que c'est même pas la peine de l'utiliser.

vas voir ma source MasterMind, j'y utilise massivement les PNG, c'est beau, rapide, pas prise de tete et surtout, Draw prend bien la transparence du PNG (directement sur le canvas sans passer par un buffer bitmap intermediaire).

voila, quand on veut enfoncer un clou, même si un manche de tournevis ou un manche de clef plate peut faire l'affaire, un marteau c'est quand même 100 fois mieux.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
13 sept. 2007 à 21:09
Procedure TForm1.MyRabbit;
var
  fBmp: TBitmap;
begin
  fBmp := TBitmap.Create;
  try
    ImageList1.GetBitmap(0,fBmp);
    fBmp.Transparent := Image1.Transparent;
    fBmp.TransparentColor := Image1.TransparentColor;
    Image1.Canvas.Draw(0,0,fBmp);
  finally
    fBmp.Free;
  end;
end;
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
13 sept. 2007 à 21:51
tu voulais dire :
...
fBmp.Transparent := Image1.Picture.Bitmap.TransparentColor;
...
?

ça marche pas de toute façon :/ là, j'ai plus rien qui s'affiche dans mon TImgage, qu'il soit en Transparent := true ou false;

En meme temps, si je fais "fBmp.Transparent := Image1.Picture.Bitmap.TransparentColor;" euh ... image1 étant vide puisque il est juste posé sur la fiche, le fBmp.transparentcolor n'obtiendra rien, non ?
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
13 sept. 2007 à 22:06
ça, ça marche :

procedure TForm1.Button1Click(Sender: TObject);
var
fBmp: TBitmap;
begin
fBmp := TBitmap.Create;
try
fBmp.TransparentMode := tmFixed;
fBmp.TransparentColor := clFuchsia;
ImageList1.GetBitmap(0,fBmp);
Image1.Canvas.Draw(0,0,fBmp);
finally
fBmp.Free;
end

MAIS (car ya un mais) avant de mettre ce lapin dans mon TImage, mon timage contient un fond (une autre bitmap), je voulais donc mettre mon lapin sur ce fond (de l'herbe evidemment :p) mais en transparent. La ce quiarrive si je mets un fond d'un bitmap d'herbe c'est qu'il remplace mon herbe par un lapin au fond transparent :''( sniff, je suis proche !

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
14 sept. 2007 à 00:39
j'irais même plus loin, la difference entre bitmap transparent et png c'est le même gouffre entre le GIF et Flash.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 sept. 2007 à 15:29
Sinon il y avait tout simplement l'API :
TransparentBLT

et la marche à suivre est très simple :

créer un BMP y mettre l'image de fond (l'herbe)
utiliser TransparentBlt pour y ajouter le lapin (en transparence)
puis faire un BitBlt sur le TImage

et voilà

 
@+
Cirec

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
14 sept. 2007 à 19:39
ça fonctionne avec PNGlib de ton mastermind foxy :]
je file le bout de code ici :

fPng := TPngObject.Create;
fPng.LoadFromFile('herbe.png');
paintbox1.Canvas.Draw(0,0,fPng);
fPng.Assign(nil);
fPng.LoadFromFile('lapin.png');
Png.TransparentColor := clFuchsia;
Png.Transparent := true;
paintbox1.Canvas.Draw(0,0,fPng);
fPng.free;

merci a vous 2 !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
14 sept. 2007 à 20:44
@cirec
Pourrais-tu donner un exemple simple de l'utilisation de TransparentBLT.
Merci par avance

cantador
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
14 sept. 2007 à 21:14
Pose 2 TImage, dans la premiere, rempli la propriété PICTURE avec une bitmap contenant du jaune pur (255-255-0) soit clYellow (ou change mon exemple toi meme)
puis voila le bout de code:
TransparentBlt(image2.Canvas.Handle, 0, 0, Image1.Width, Image1.Height, Image1.Canvas.Handle, 0, 0, Image1.Width, Image1.Height, clYellow);

infos : http://msdn2.microsoft.com/en-us/library/ms532303.aspx
images avec du jaune : http://images.google.fr/images'hl=fr&q=jaune&btnG=Recherche+d%27images
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 sept. 2007 à 21:40
Merci JulioDelphi pour l'exemple

@Cantador
si tu as des soucis avec tu me fais signe

 
@+
Cirec

cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
15 sept. 2007 à 14:06
Salut,

Sinon il existe aussi la fonction BrushCopy du canvas qui permet ainsi de dessiné avec la transparence
 
usage:
  Canvas.BrushCopy(DestRect , Bmp , SrcRect , Bmp.Canvas.Pixels[0,0]);

@+
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
15 sept. 2007 à 16:03
@cirec
merci, mais je te répondrai plus tard, car j'ai un gros souci d'installation de compos sur D7 en ce moment..
@+

cantador
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
15 sept. 2007 à 23:57
@cirec
Ouf je m'en suis sorti (Install de TeeChartPro.. avec ReportBuilder..)
Pour revenir à TramsparentBlt, je ne vois pas de transparence.
Il y a un truc qui m'échappe..

cantador
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
16 sept. 2007 à 22:12
@Cantador :
Télécharge cette mini-source

c'est un exemple des plus simples
si tu as besoin de précisions ... n'hésites pas

 
@+
Cirec

Rejoignez-nous