// Es wird ein
Lichtfleck mit einer schwachen Korona auf einem Bitmap
// dargestellt. Dabei kann die Helligkeit, der Kontrast und die
Ausbreitung
// in einem Bereich von 1 bis 10 eingestellt werden. Der Fleck kann die
Farben
// rot, blau, gruen, violett, gelb, blaugrün und weiß annehmen.
// Getestet mit D4 unter WinME
|
|
uses math;
type bereich = 1..10;
procedure LichtFleck(bmp: TBitmap; x, y: integer; helligkeit, kontrast,
ausbreitung: bereich; rot, gruen, blau: boolean);
var
i, j: integer;
d: double;
p: PBytearray;
begin
bmp.pixelformat := pf24bit;
for j := 0 to bmp.height - 1 do begin
p := bmp.scanline[j];
i := 0;
while i <= bmp.width * 3 - 1 do begin
d := (min(255, max(0, -(15 - ausbreitung * 1.5) * helligkeit * 10 +
power(255 - sqrt(power(x - i div 3, 2) +
power(y - j, 2)), 5) * helligkeit / 6666666666))) /
(3.2 - ((kontrast - 0.75) / 5 + 0.5)) + random(10);
if d > 0 then begin
if blau then p[i] := round(min(p[i] + d, 255));
if gruen then p[i + 1] := round(min(p[i + 1] + d, 255));
if rot then p[i + 2] := round(min(p[i + 2] + d, 255));
end;
inc(i, 3);
end;
end;
end;
// Beispielaufruf:
// Ein weißer Lichtfleck
procedure TForm1.Button1Click(Sender: TObject);
var
b: TBitmap;
begin
b := TBitmap.create;
b.loadfromfile('d:\bilder\cat.bmp');
canvas.draw(0, 0, b); // zur Kontrolle ohne Fleck
LichtFleck(b, 65, 67, 7, 4, 5, true, true, true);
canvas.draw(b.width, 0, b);
b.free;
end;
|