Danke an Blup du hast mich auf die richtige Idee gebracht.
Ich hab aus dem Orginalbild ein Bild nur mit Alphakanal gemacht, darauf kommt es mir ja auch eigentlich nur an. (siehe Anhang)
hier dann der Code:
Delphi-Quellcode:
uses
ShLwApi; // für RGBToHLS und HLSToRGB
function LoadPNG(Name: string; NewColor: TColor): Graphics.TBitmap;
var
PNGImage : TPngObject;
hLib : THandle;
NewHue, NewLuminance, NewSaturation : Word;
x, y: Integer;
pb : pByteArray;
begin
Result := Graphics.TBitmap.Create;
try
hLib := LoadLibrary(...);
PNGImage := TPngObject.Create;
PNGImage.LoadFromResourceName(hLib, Name);
PNGImage.Transparent := true;
ColorRGBToHLS(NewColor, NewHue, NewLuminance, NewSaturation);
with PNGImage do
begin
for y := 0 to Height - 1 do
begin
pb := AlphaScanline[y];
for x := 0 to Width - 1 do
begin
Pixels[x, y] := ColorHLSToRGB(NewHue, Trunc((pb^[x] + NewLuminance) / 2), NewSaturation);
end;
end;
end;
Result.Canvas.Brush.Color := clBtnFace;
Result.Width := PNGImage.Width;
Result.Height := PNGImage.Height;
Result.Canvas.StretchDraw(Rect(0, 0, PNGImage.Width, PNGImage.Height), PNGImage);
PNGImage.Free;
except
end;
end;
Im nachhinein eigentlich ganz einfach.
1. PNGImage laden (hier über LoadFromResourceName)
2. die neue Farbe des Bildes in HLS umwandeln
3. mit AlphaScanline den Alphakanal des Bildes laden
4. die Pixel mit der neuen Farbe und dem richtigen Alphawert setzen
5. da ich hier ein TBitmap zurückgebe, die Hintergrundfarbe setzen das PNGImage zeichnen
Gruß David