Nur mal so nebenbei, ich habe mit das einfach mal so (siehe D.-Code) umgeschrieben. Dann kann man auch auf die extra
Unit verzichten und die handhabung ist für mich einfacher/fexibler.
Delphi-Quellcode:
// Function: PNGToBitmap32(DstBitmap: TBitmap32; Png: TPngObject): Boolean;
// Das Result ist TRUE wenn das PNG-Image einen Alphachannel hat.
//////////////////////////////////////////////////////////////////////////////
function PNGtoBitmap32(DstBitmap: TBitmap32; Png: TPngObject): Boolean;
var
TransparentColor: TColor32;
PixelPtr: PColor32;
AlphaPtr: PByte;
X, Y: Integer;
begin
DstBitmap.Assign(PNG);
DstBitmap.ResetAlpha;
case PNG.TransparencyMode of
ptmPartial: // 8Bit Image
begin
if (PNG.Header.ColorType = COLOR_GRAYSCALEALPHA) or
(PNG.Header.ColorType = COLOR_RGBALPHA) then
begin
PixelPtr := PColor32(@DstBitmap.Bits[0]);
for Y := 0 to DstBitmap.Height - 1 do
begin
AlphaPtr := PByte(PNG.AlphaScanline[Y]);
for X := 0 to DstBitmap.Width - 1 do
begin
PixelPtr^ := (PixelPtr^ and $00FFFFFF) or (TColor32(AlphaPtr^) shl 24);
Inc(PixelPtr);
Inc(AlphaPtr);
end;
end;
end;
Result := True;
end;
ptmBit: // 24 Bit Image
begin
TransparentColor := Color32(PNG.TransparentColor);
PixelPtr := PColor32(@DstBitmap.Bits[0]);
for X := 0 to (DstBitmap.Height - 1) * (DstBitmap.Width - 1) do
begin
if PixelPtr^ = TransparentColor then
PixelPtr^ := PixelPtr^ and $00FFFFFF;
Inc(PixelPtr);
end;
Result := True;
end;
ptmNone:
Result := False;
end;
end;
Delphi-Quellcode:
// Anwendungsbeispiel:
uses ..., GR32, PNGImage;
var
PngImg: TPngObject;
Bmp32: TBitmap32;
BEGIN
Bmp32 := TBitmap32.Create;
try
PngImg := TPngObject.Create;
try
PngImg.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'test.png');
// oder PngImg.LoadFromResource(...); etc.
PNGToBitmap32(Bmp32, PngImg);
finally
PngImg.Free;
end;
Bmp32.Draw(...);
finally
Bmp32.Free;
end;
end;
END.