Dieses Beispiel zeigt, wie man ein Bitmap als Lupe einsetzen kann.
Das Bitmap sollte transparent sein und eine schwarze Hintergrundfarbe haben.
Außerdem sollte die Bittiefe möglichst 8 Bit haben.
TypeRGB = Record
Bleu, Vert, Rouge : Byte;
End;
TypeTRGBArray = Array [0..400] Of TypeRGB;
TypePRGBArray = ^TypeTRGBArray;
TypeRebond = Array [1..180] Of Integer;
Var Form1 : TForm1;
BMPImage,
BMPBuffer,
BMPMask,
BMPLoupe : TBitmap;
XPos, YPos, Dx : Integer;
AncXPos, AncYPos : Integer;
Rebond : TypeRebond;
CptRebond : Byte;
Souris : tPoint;
//
Procedure TForm1.FormCreate(Sender: TObject);
var
Cpt : Integer;
begin
Randomize;
BMPImage := TBitmap.Create;
BMPImage.LoadFromFile('Image.bmp'); // Hintergrundbild
BMPImage.PixelFormat := pf24Bit;
BMPBuffer:= TBitmap.Create;
BMPBuffer.PixelFormat := pf24Bit;
BMPBuffer.Width := 128; BMPBuffer.Height := 128;
BMPMask := TBitmap.Create;
BMPMask.LoadFromFile('Mask.bmp'); // Lupe
BMPMask.PixelFormat := pf24Bit;
BMPLoupe := TBitmap.Create;
BMPLoupe.PixelFormat := pf24Bit;
BMPLoupe.Width := 128; BMPLoupe.Height := 128;
BMPLoupe.Transparent := True;
BMPLoupe.TransparentColor := RGB(0, 0, 0);
XPos := Random(272) + 64;
Dx := (Random(2)*2)-1;
for Cpt := 1 To 180 Do
Rebond[Cpt] := Trunc(Sin(Cpt*(Pi/180))*250);
CptRebond := Random(30) + 90;
YPos := 336 - Rebond[CptRebond];
AncXPos := XPos; AncYPos := YPos;
BMPBuffer.Canvas.CopyRect(Bounds(0, 0, 128, 128),
BMPImage.Canvas, Bounds(AncXPos-64, AncYPos-64, 128, 128));
End;
Procedure TForm1.FormClose(Sender: TObject; Var Action: TCloseAction);
Begin
BMPImage.Free;
BMPBuffer.Free;
BMPMask.Free;
BMPLoupe.Free;
End;
Procedure TForm1.AppliquerMasque;
Var X, Y, lR, lV, lB, mR, mV, mB : Integer;
ScanLoupe, ScanMasque : TypePRGBArray;
Begin
For Y := 0 To 127 Do
Begin
ScanLoupe := BMPLoupe.ScanLine[Y];
ScanMasque := BMPMask.ScanLine[Y];
For X := 0 To 127 Do
Begin
mR := ScanMasque[X].Rouge;
mV := ScanMasque[X].Vert;
mB := ScanMasque[X].Bleu;
If (mR = 0) And (mV = 0) And (mB = 255) Then
Begin
lR := ScanLoupe[X].Rouge;
lV := ScanLoupe[X].Vert;
lB := ScanLoupe[X].Bleu + 128;
If lB > 255 Then lB := 255;
End
Else Begin
lR := mR;
lV := mV;
lB := mB;
End;
ScanLoupe[X].Rouge := lR;
ScanLoupe[X].Vert := lV;
ScanLoupe[X].Bleu := lB;
End;
End;
End;
Procedure TForm1.TimerAnimTimer(Sender: TObject);
Var Cpt : Byte;
Begin
For Cpt := 1 To 4 Do
Begin
If (Souris.X >= 64) And (Souris.X <= 336) And (Souris.Y >= 64) And (Souris.Y <= 336) Then
Begin
XPos := Souris.X;
YPos := Souris.Y;
End
Else
Begin
Inc(XPos, Dx); If (XPos = 64) Or (XPos = 336) Then Dx := -Dx;
CptRebond := (CptRebond Mod 180) + 1;
YPos := 336 - Rebond[CptRebond];
End;
BMPImage.Canvas.Draw(AncXPos-64, AncYPos-64, BMPBuffer);
BMPBuffer.Canvas.CopyRect(Bounds(0, 0, 128, 128),
BMPImage.Canvas, Bounds(XPos-64, YPos-64, 128, 128));
AncXPos := XPos; AncYPos := YPos;
BMPLoupe.Canvas.CopyRect(Bounds(0, 0, 128, 128),
BMPImage.Canvas, Bounds(XPos-32, YPos-32, 64, 64));
AppliquerMasque;
BMPImage.Canvas.Draw(XPos-64, YPos-64, BMPLoupe);
Image1.Canvas.Draw(0, 0, BMPImage);
End;
End;
Procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
Begin
Souris.X := X;
Souris.Y := Y;
End;
Keine Kommentare:
Kommentar veröffentlichen