![]() |
Transparentes PNG->BMP->PNG
Hallo,
Ich habe noch kleine Probleme mit der Handhabung von transparenten PNG und Bitmaps und vorallem der Speicherung von transparenten Alpha-Bitmaps als PNG. Verwendet wird DelphiXE2. Aufs wesentliche beschränkt:
Delphi-Quellcode:
Ich habe da immer einen schwarzen Hintergrund beim gespeicherten PNG. Eigentlich kann es auch nicht gehen, da bei png.assign und dort BuildHeader
PNG:=TPngImage.Create;
//irgendein 32bit Aplha PNG mit unterschiedlicher Transparenz (Schatten ...) laden PNG.LoadFromFile(Dateipfad+'airplane.png'); bmp.Assign(png); //die Bitmap wird hübsch mit Schatten dargestellt und das bmp ist auch ein 32bit Canvas.Draw(350,100,bmp); PNG.Assign(bmp); //Hintergrund ist schwarz PNG.SaveToFile(Dateipfad+'airplane_DP1.png');
Delphi-Quellcode:
Da wird ja nie ein RGBAlpha PNG erstellt.
…
{Set color type} if Info.bmBitsPixel >= 16 then Header.ColorType := COLOR_RGB else Header.ColorType := COLOR_PALETTE; … Verwenden tue ich jetzt
Delphi-Quellcode:
Mit
PNG2:=TPngImage.CreateBlank(COLOR_RGBALPHA, 8, bmp.Width , bmp.Height);
Bitmap_To_PNG_MitAlphaChannel(bmp,png2); png2.SaveToFile(Dateipfad+'airplane_DP2.png');
Delphi-Quellcode:
wird das PNG ordentlich gespeichert.
procedure Bitmap_To_PNG_MitAlphaChannel(SrcBmp: TBitmap; DestPng: TPNGObject);
var PixelPtr: PRGBQuad; ColorPtr: PRGBTriple; AlphaPtr: PByte; X, Y: Integer; begin DestPng.SetSize(SrcBmp.Width,SrcBmp.Height); DestPng.Header.ColorType := COLOR_RGBALPHA; if (SrcBmp.PixelFormat = pf32bit) then begin for Y := 0 to DestPng.Height - 1 do begin AlphaPtr := PByte(DestPng.AlphaScanline[Y]); ColorPtr := DestPng.Scanline[Y]; PixelPtr := SrcBmp.Scanline[y]; for X := 0 to DestPng.Width - 1 do begin ColorPtr^.rgbtBlue := PixelPtr^.rgbBlue; ColorPtr^.rgbtGreen := PixelPtr^.rgbGreen; ColorPtr^.rgbtRed := PixelPtr^.rgbRed; AlphaPtr^ := PixelPtr^.rgbReserved; Inc(PixelPtr); Inc(AlphaPtr); Inc(ColorPtr); end; end; end else DestPng.Assign(SrcBmp); end; Fragen: - gibt es eine andere (einfachere) Möglichkeit? - Verhalten sich neuere Delphis anders, bzw wie sieht dort die Buildheader procedure aus? Danke & Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 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