content que ça te plaises
pour le souci suivant ... ça t'as peut être échappé mais le code permet non seulement la conversion du PNG en BMP32 mais il peut aussi redimensionner le bitmap dans la foulée ... j'ai donc modifié le code suivant afin qu'il double la taille du bmp et que le problème de transparence finale soit également réglé.
* depuis BDS1 pour détecter les fuites de mémoires tu peux ajouter ceci dans le OnCreate de ta fiche:
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 begin aPng := TPngImage.Create; aPng.LoadFromFile('D:\Test\Output_0001.png'); aBMP := TBitmap.Create; // ici on peut décider de redimensionner le Bitmap de sorti aBMP.Width := aPNG.Width * 2; // aPNG.Width div 2; aBMP.Height := aPNG.Height * 2; // aPNG.Height div 2; aBMP.PixelFormat := pf32bit; if aPng.TransparencyMode = ptmPartial then PartialTransPng2Bmp32(aPNG, aBMP); // totalement inutile ici !! // aBMP.AlphaFormat := afPremultiplied; aBmp2 := TBitmap.Create; aBmp2.Width:=2792; aBmp2.Height:=aBmp.Height; aBmp2.PixelFormat:=pf32bit; aBmp2.Canvas.Brush.Color := clBlack; aBmp2.Canvas.FillRect(aBmp2.Canvas.ClipRect); aBmp2.Canvas.CopyRect(Rect(0,0, aBMP.Width, aBMP.Height),aBmp.Canvas, aBMP.Canvas.ClipRect); aBmp2.Canvas.CopyRect(Rect(1400,0, 1400 + aBMP.Width, aBMP.Height),aBmp.Canvas, aBMP.Canvas.ClipRect); // la pré-multiplication n'est utile que si l'on souhaite // afficher le Bitmap avec la transparence aBmp2.AlphaFormat := afPremultiplied; Image2.Picture.Assign(aBmp2); // ne jamais utiliser une fonction qui retourne un objet comme ceci ... // Bmp32ToPng(aBMP2).SaveToFile('Cirec.png'); // en procédant ainsi on perd la référence du composant créé et on ne peut // plus le libérer ... du coup il y a fuite de mémoire (* voir suite du message) // il faut absolument procéder comme ceci: (** voir suite du message) with Bmp32ToPng(aBMP2) do try SaveToFile('D:\Test\Cirec.png'); finally Free; end; aBMP.Free; aBmp2.Free; aPng.Free; end;
**
Code : Sélectionner tout - Visualiser dans une fenêtre à part ReportMemoryLeaksOnShutdown := True;
ou encore comme ceci:
je pense que tout y est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 var bPng: TPNGImage; begin bPng := Bmp32ToPng(aBMP2); if Assigned(bPng) then try bPng.SaveToFile('D:\Test\Cirec.png'); finally bPng.Free; end; end;
@+ Cirec
Partager