procedure TForm1.btnIconWithStarClick(Sender: TObject);
var
png: TPngImage;
bm: TBitmap;
begin
png := TPngImage.Create;
try
// png für die richtige Größe erstellen. Das 128,128 garantiert nicht, dass das
// png wirklich eine Größe von 128x128 hat. Es wird nur das nächstbeste genommen.
png.Assign(ImageCollection.GetSourceImage(ImageCollection.GetIndexByName
('Icon'), 128, 128));
// Eine Bitmap für schwarzen Hintergrund machen
// pf32bit wird für den alpha-channel gebraucht.
bm := TBitmap.Create;
try
bm.PixelFormat := pf32bit;
bm.SetSize(png.Width, png.height);
bm.Canvas.Brush.Color := clBlack;
bm.Canvas.FillRect(Rect(0, 0, bm.Width, bm.height));
// png per alpha-blend auf den canvas von bm zeichen
bm.Canvas.Draw(0, 0, png);
// 'Star' auf bm zeichnen per ImageCollection.Draw
// Das Rect kann bei Bedarf angepasst werden
ImageCollection.Draw(bm.Canvas, Rect(0, 2 * bm.height div 3,
bm.Width div 3, bm.height), 'Star');
// bm enthält als alpha die durchsichtigen Teile von icon und star kombiniert.
// Jetzt nur noch dieses alpha anwenden:
bm.Alphaformat := afDefined;
// Kombiniertes Bild anzeigen
Image1.Picture.Graphic := bm;
// Image1 zeigt jetzt wahrscheinlich die richtige Kombination an.
// Das folgende geht aber nicht, weil
VCL.Graphics nicht das alpha von bm auf png überträgt,
// sondern die transparente Farbe, wahrscheinlich weil darüber die wenigsten Leute
// meckern würden. Und wenn man bm erst transparent macht, gibt das immer hässliche Resultate.
png.Assign(bm);
// Das kombinierte Bild speichern
png.SaveToFile('IconWithStar.png');
finally
bm.Free;
end;
finally
png.Free;
end;
end;