![]() |
TPNGImage - Alphachannel in Bitmap anzeigen
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich grübele schon eine gamze Weile darüber wie man aus einer PNG-Graphik die Alphamaske auslesen kann. Bei der Lib ![]() Bei meinen Versuchen ist es mir nicht gelungen ein vernünftiges Bild zu bekommen. Mit Scanline und 32 -Bit Bitmaps kenn ich mich jetzt nicht so aus.
Delphi-Quellcode:
Könnte mir da jemand helfen ?
for y := 0 to PNG.Height - 1 do
begin p := PNG.AlphaScanline[y]; p2 := MaskBmp.ScanLine[y]; for x := 0 to (PNG.Width -1)*4 do p2[x] := p[x]; end; Die Gr32 Kompo. will ich nicht verwenden. |
Re: TPNGImage - Alphachannel in Bitmap anzeigen
Liste der Anhänge anzeigen (Anzahl: 1)
Hi!
Wenn du sowas wie im Anhang suchst dann kannst du diesen Code nehmen:
Delphi-Quellcode:
var
PNG : TPNGObject; AlphaBMP : TBitmap; Scanline : pByteArray; x,y : Integer; begin PNG:=TPNGObject.Create; PNG.LoadFromFile('E:\Icons\PNGIcons\nuvola\64x64\filesystems\link.png'); png.Draw(Image1.Canvas,Rect(0,0,Png.Width,png.Height)); AlphaBMP:=TBitmap.Create; AlphaBMP.Width:=png.Width; AlphaBMP.Height:=png.Height; AlphaBMP.PixelFormat:=pf8bit; for y:=0 to png.Height-1 do begin Scanline:=png.AlphaScanline[y]; for x:=0 to png.Width-1 do AlphaBMP.Canvas.Pixels[x,y]:=RGB(Scanline^[x],Scanline^[x],Scanline^[x]); end; PaintBox1.Canvas.Draw(0,0,AlphaBMP); AlphaBMP.SaveToFile('c:\test.bmp'); AlphaBMP.Free; png.Free; end; |
Re: TPNGImage - Alphachannel in Bitmap anzeigen
Ja sowas such ich, allerdings ohne das .Pixels[x,y].
Ich komme mal wieder mit dem Scanline nicht zurrecht. ;) |
Re: TPNGImage - Alphachannel in Bitmap anzeigen
Zitat:
Stört dich die Mal-Routine und/oder deren Geschwindigkeit? :gruebel: |
Re: TPNGImage - Alphachannel in Bitmap anzeigen
Die Geschwindigkeit. Und wenn ich mal mit Scanline anfange mache ich dann auch damit gern weiter...
;) |
Re: TPNGImage - Alphachannel in Bitmap anzeigen
Du musst beachten, dass AlphaScanline ein Byte, Scanline aber ein TRGBQuad (bzw. je nach PixelFormat) liefert.
Mit meinem Avatar erfolgreich getestet:
Delphi-Quellcode:
TCardinalArray = Array[0..0] of Cardinal;
PCardinalArray = ^TCardinalArray; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var Png: TPNGObject; x, y: Integer; pTo: PCardinalArray; pFrom: PByteArray; Alpha: Byte; begin if OpenPictureDialog1.Execute then begin Png := TPNGObject.Create; try Png.LoadFromFile(OpenPictureDialog1.FileName); Image1.Width := Png.Width * 2; Image1.Height := Png.Height; Image1.Picture.Bitmap.Width := Png.Width * 2; Image1.Picture.Bitmap.Height := Png.Height; Image1.Picture.Bitmap.PixelFormat := pf32bit; Image1.Canvas.Draw(0, 0, Png); for y := 0 to Png.Height - 1 do begin pFrom := Png.AlphaScanline[y]; pTo := Image1.Picture.Bitmap.ScanLine[y]; for x := 0 to Png.Width - 1 do begin Alpha := pFrom[x]; pTo[x + Png.Width] := Alpha or Alpha shl 8 or Alpha shl 16; end; end; finally Png.Free; end; end; end; |
Re: TPNGImage - Alphachannel in Bitmap anzeigen
Vielen Dank, das muss ich mir erst einmal angucken (durchdenken)
Delphi-Quellcode:
das mit dem RGBQuad hatte ich auch schon vwesucht, hat aber nicht funktionieren wollen...
pTo[x + Png.Width] := Alpha or Alpha shl 8 or Alpha shl 16;
:thumb: |
Re: TPNGImage - Alphachannel in Bitmap anzeigen
Zitat:
Delphi-Quellcode:
Wenn du nicht darauf angewiesen bist, das es nur Grau-Werte in deinem Bild gibt, kannst du in meinem Beispiel die Schleife dahin abändern:
Pixels[x,y]:=RGB(Scanline^[x],Scanline^[x],Scanline^[x]);
Delphi-Quellcode:
Schneller gehts imho nicht.
for y:=0 to png.Height-1 do
begin Scanline:=png.AlphaScanline[y]; ToScanLine:=AlphaBMP.ScanLine[y]; CopyMemory(ToScanLine,Scanline,png.Width); end; |
Re: TPNGImage - Alphachannel in Bitmap anzeigen
Schneller geht es nicht, aber ich brauche schon die Graustufen der Maske. ;)
|
Re: TPNGImage - Alphachannel in Bitmap anzeigen
Hi zusammen,
was mache ich falsch, wenn aus diesem Bild (der weiße Bereich ist laut ![]() ![]() durch folgenden Code (siehe auch oben)
Code:
dieses Bild
var
PNG : TPNGObject; AlphaBitmap : TBitmap; Scanline , ToScanLine : pByteArray ; y : Integer; begin PNG := TPNGObject.Create; PNG.LoadFromFile('test.png'); AlphaBitmap := TBitmap.Create; AlphaBitmap.Width := PNG.Width; AlphaBitmap.Height := PNG.Height; AlphaBitmap.PixelFormat := pf8bit; for y:=0 to png.Height-1 do begin Scanline := PNG.AlphaScanline[y]; ToScanLine := AlphaBitmap.ScanLine[y]; CopyMemory(ToScanLine, Scanline, PNG.Width); end; Image1 . Picture . Assign ( AlphaBitmap ) ; AlphaBitmap.Free; PNG.Free; end; ![]() wird? Gibt es (mitterlweile) irgendeine native oder elegantere Möglichkeit PNGs samt Transparenz auf VCL-Komponenten abzubilden? Danke im Voraus, Spes |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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