TImageList, TImage et Transparence

Résolu
JulioDelphi
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
- 13 sept. 2007 à 19:00
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 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
37
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.
3
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
37
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;
0
JulioDelphi
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
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 ?
0
JulioDelphi
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
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 !
0

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
37
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.
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
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

0
JulioDelphi
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
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 !
0
cs_cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
14 sept. 2007 à 20:44
@cirec
Pourrais-tu donner un exemple simple de l'utilisation de TransparentBLT.
Merci par avance

cantador
0
JulioDelphi
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
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
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
14 sept. 2007 à 21:40
Merci JulioDelphi pour l'exemple

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

 
@+
Cirec

0
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]);

@+
0
cs_cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
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
0
cs_cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
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
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
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

0