Mach das einfach mit Scanline... es ist nicht so kompliziert wie es sich vielleicht anhört.
Ich habs grad einfach mal aus dem Kopf runtergeschrieben, weil es glaub ich länger dauern würde, es mit Worten zu erklären, und dann immer noch unklarer wäre:
Delphi-Quellcode:
function Clamp(Value: Integer; Min, Max: Integer); inline;
begin
Result := Value;
if Result < Min then Result := Min;
if Result > Max then Result := Max;
end;
procedure AdjustLuminance(Bmp: TBitmap; Offset: SmallInt)
Bmp: TBitmap;
Pixel: PRGBQuad;
x,y: integer;
begin
Bmp.PixelFormat := pf32Bit;
for y := 0 to Bmp.Height - 1 do
begin
// Pointer auf 1. Pixel in der Zeile holen
Pixel := Bmp.Scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
Pixel^.R := Clamp(Pixel^.R + Offset, 0, 255);
Pixel^.G := Clamp(Pixel^.G + Offset, 0, 255;
Pixel^.B := Clamp(Pixel^.B + Offset, 0, 255);
// ein Pixel nach rechts gehen
inc(Pixel);
end;
end;
end;
Delphi-Quellcode:
AdjustLuminance(Bmp, 50); // Aufhellen
AdjustLuminance(Bmp, -50); // Abdunkeln
Für PRGBQuad musst du irgendeine
Unit einbinden, ich hab es grad nicht im Kopf, welche. Oder du deklarierst dir den Record einfach selbst:
Delphi-Quellcode:
type
PRGBQuad = ^TRGBQuad;
TRGBQuad = packed record
B, G, R, A: Byte;
end;
PS: Kann sein, dass Luminance hier formal gesehen der richtige Begriff ist. Aber für einen Hover-Effekt reicht es allemal, und wenn nicht, kann man die Berechnung in der Schleife ja einfach austauschen.