// Getestet mit RS 10.4 unter Win11
//
Variante 1
// In
dieser Variante wird eine transparente PNG mit den
// Abmaßen 200 x 200 über den Umweg einer Bitmap erzeugt.
uses
Vcl.Imaging.PngImage;
var
png: TPngImage;
bmp: TBitmap;
Transparenz: TColor = clBlack;
procedure TForm1.FormCreate(Sender: TObject);
begin
bmp := TBitmap.Create(200, 200);
bmp.Canvas.Brush.Color := Transparenz;
bmp.Canvas.FillRect(bmp.Canvas.ClipRect);
bmp.Transparent := true;
png := TPngImage.Create;
png.Assign(bmp);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(png);
FreeAndNil(bmp);
end;
// kleines Anwendungs-Beispiel
procedure TForm1.Button1Click(Sender: TObject);
begin
// zum Testen
with png, Canvas do
begin
Pen.Width := 10;
Brush.Style := bsClear;
Pen.Color := clRed;
RecTangle(5, 5, Width -5, Height -5);
Brush.Color := clYellow;
Pen.Color := clBlue;
Ellipse(20, 15, 120, 115);
end;
png.SaveToFile('D:\Test.png'); // z.B.
Form1.Canvas.Draw(10, 10, png); // z.B.
end;
//-----------------------------------------
// Variante 2
// Das Ergebnis dieser Variante ist das gleiche, aber die
// Transparenz wird über den Alphakanal erzeugt.
uses
Vcl.Imaging.PngImage;
var
png: TPngImage;
procedure TForm1.FormCreate(Sender: TObject);
begin
png := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, 200, 200);
png.CreateAlpha;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(png);
end;
// Anwendungsbeispiel
procedure TForm1.Button1Click(Sender: TObject);
var
slf, sla: PByteArray;
X, Y: Integer;
begin
with png, Canvas do
begin
Pen.Width := 10;
Brush.Style := bsClear;
Pen.Color := clRed;
RecTangle(5, 5, Width -5, Height -5);
Brush.Color := clYellow;
Pen.Color := clBlue;
Ellipse(20, 15, 120, 115);
end;
for Y := 0 to pred(png.Height) do
begin
sla := png.AlphaScanline[Y];
slf := png.SCanline[Y];
for X := 0 to pred(png.Width) do
begin
if (slf^[X * 3] <> 0) or (slf^[X * 3 + 1] <> 0) or (slf^[X * 3 + 2] <> 0)
then
sla^[X] := 255;
end;
end;
png.SaveToFile('D:\Test.png'); // z.B.
Form1.Canvas.Draw(10, 10, png); // z.B.
end;
|