![]() |
Wie erstellt man ein transparentes pf32bit-Bitmap?
Hallo,
noch ein Problem, an dem ich mir die Zähne ausbeiße. Wie bekommt ein 32bit-Bitmap wirklich transparent? Ich meine nicht transparent/transparentcolor, das reicht nicht. (Hintergrund: ich möchte ein 32bit-Alpha-Icon per DrawIconEx skaliert auf ein Bitmap zeichnen und dieses Bitmap mit Transparenz weiterverwenden) Wenn ich ein Bitmap erstelle
Delphi-Quellcode:
Ist der Hintergrund trotzdem weiß.
Bmp:=TBitmap.create;
Bmp.Pixelformat:=pf32bit; BMP.Width:=50; BMP.height:=50; DrawIconEx(…); Canvas.draw(0,0,bmp); Wenn ich das dazwischen setze,
Delphi-Quellcode:
Hab ich was ich will. Aber wie bekomme ich das ohne den Umweg über ein PNG hin?
png:=TPngImage.CreateBlank(COLOR_RGBALPHA,8,bmp.Width,bmp.Height);
bmp.Assign(png); Danke&Gruß Frank |
AW: Wie erstellt man ein transparentes pf32bit-Bitmap?
|
AW: Wie erstellt man ein transparentes pf32bit-Bitmap?
Wobei eine Bitmap dafür eigentlich wenig sinnvoll ist. Muss es denn unbedingt eine Bitmap sein?
|
AW: Wie erstellt man ein transparentes pf32bit-Bitmap?
Zitat:
Zitat:
|
AW: Wie erstellt man ein transparentes pf32bit-Bitmap?
Wenn du nicht unbedingt auf Bordmittel festgelegt bist: In den Elpack-Komponenten (sicherlich auch bei anderen Sammlungen ähnlich) kann man alle Gui-Controls (imageList, ....) mit PNG's arbeiten lassen. Dann sind solche problematischen Workarounds gar nicht mehr nötig.
|
AW: Wie erstellt man ein transparentes pf32bit-Bitmap?
Zitat:
Delphi-Quellcode:
laut deiner Aussage funktioniert. Hast du auch ausprobiert, dass das mit allen Hintergrundfarben funktioniert? Nicht, dass es nur gerade zufällig so aussieht als würde es funktionieren, weil beim Entfernen des Alphakanals zufällig gegen die richtige Farbe geblendet wird... Wenn ich halbtransparente Bilder in MS Paint einfüge, werden die z.B. auch gegen einen virtuellen, schwarzen Hintergrund geblendet.
bmp.Assign(png);
Also ich würde dir auch zu Graphics32 raten, die Lib ist wirklich gut. |
AW: Wie erstellt man ein transparentes pf32bit-Bitmap?
Zitat:
Zitat:
Zitat:
Natürlich geht das auch mit TBitmap. Wichtig ist, daß bei der Erstellung des Bitmaps auch die Eigenschaft AlphaFormat gesetzt wird, damit TBitmap intern die Methode AlphaBlend verwendet. Die zweite Sache ist, daß ein neues Bitmap weiß gefüllt ist und einen Alphawert von $FF für jedes Pixel besitzt. Deshalb muß es vor dem Kopieren eines Icons vollständig gelöscht werden, da sonst das Icon auf den weißen Hintergrund gerendert wird. Da Du XE2 verwendest, habe ich das mal schnell als Class-Helper programmiert:
Delphi-Quellcode:
Damit funktioniert sowohl das Kopieren eines 32Bit Bildes aus einer Image-Liste in das leere Bitmap als auch dessen Ausgabe in eine Paintbox:
type
TBitmapHelper = class helper for TBitmap procedure Clear(Color: TColor; Alpha: Byte); end; procedure TBitmapHelper.Clear(Color: TColor; Alpha: Byte); type TColor32 = packed record case Integer of 0: (B, G, R, A: Byte); 1: (BGRA: UInt32); end; TColor32Array = array[0..0] of TColor32; PColor32Array = ^TColor32Array; var X, Y: Integer; R, G, B: Byte; Line: PColor32Array; begin R:=GetRValue(Color); G:=GetGValue(Color); B:=GetBValue(Color); for Y:=0 to Height-1 do begin Line:=ScanLine[Y]; for X:=0 to Width-1 do begin Line[X].R:=R; Line[X].G:=G; Line[X].B:=B; Line[X].A:=Alpha; end; end; end;
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var Bmp: TBitmap; begin Bmp:=TBitmap.Create; try Bmp.SetSize(50,50); Bmp.PixelFormat:=pf32bit; Bmp.AlphaFormat:=afDefined; Bmp.Clear(clBlack,0); ImageList1.Draw(Bmp.Canvas,0,0,0); //PaintBox1.Canvas.Draw(0,0,Bmp); PaintBox1.Canvas.StretchDraw(Rect(0,0,100,100),Bmp); finally Bmp.Free; end; end; |
AW: Wie erstellt man ein transparentes pf32bit-Bitmap?
Zitat:
Also wo ist das Vorurteil? |
AW: Wie erstellt man ein transparentes pf32bit-Bitmap?
Wozu sollte ein komplettes und umfangreiches Framework wie TBitmap32 oder Elpack verwendet werden, wenn das Problem auch mit einer einzigen (!!!) zusätzlichen Methode und integrierten Objekten zu lösen ist? Und weshalb stellt das Löschen eines 32Bit Bitmaps bzw. das Kopieren eines Bildes (Icon/Bitmap) aus einer Image-Liste in ein Bitmap einen "problematischen" Workaround dar? :gruebel:
Mit den Vorurteilen meinte ich die bezüglich der Untauglichkeit von TBitmap in Zusammenhang mit teiltransparenten Bildern. Es funktioniert (zumindest in neueren Delphi-Versionen) - man muß nur wissen, wie. :-D |
AW: Wie erstellt man ein transparentes pf32bit-Bitmap?
Zitat:
Aber wenn es nicht anders geht, bleibt einem ja nichts anderes übrig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz