// 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; 



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke