Home » Tipps & Tricks » Multimedia » Sonstiges » Lupe programmieren
Lupe programmieren
Um eine Lupe zu programmieren kann man folgende Funktion benutzen.Achtung: die beiden Images müssen schon bestehen und es muß sich um Bitmaps handeln (keine jpeg’s oder gif’s).
procedure Lupe(Original, Lupe: TImage; Region: Hrgn; LupeRect: TRect; Mitte: TPoint; Faktor: integer); { Original: das Bild, das vergrößert werden soll Lupe: das Bild, in das das Ergebnis gezeichnet werden soll Region: gibt die Möglichkeit, eine "richtig" runde Lupe zu zeichnen; Achtung: die Region wird weder erstellt noch gelöscht!! LupeRect: In welches Rechteck des Lupe-Images soll gezeichnet werden Mitte: Der Punkt im Originalbild, um den herum vergrößert werden soll Faktor: der Faktor, um den vergrößert werden soll ACHTUNG: bei Original und Lupe muß es sich jeweils um Bitmaps handeln, sonst gibt es eine Fehlermeldung! } var OriginalRect: TRect; begin Faktor := abs(Faktor); OriginalRect.Top:=Mitte.Y; OriginalRect.left:=Mitte.X; OriginalRect.Bottom:=OriginalRect.Top; OriginalRect.right:=OriginalRect.Left; OriginalRect.Top:= OriginalRect.Top-((LupeRect.Bottom-LupeRect.Top) div Faktor) div 2; OriginalRect.Bottom:= OriginalRect.Bottom+((LupeRect.Bottom-LupeRect.Top) div Faktor) div 2; OriginalRect.Left:= OriginalRect.Left-((LupeRect.right-LupeRect.Left) div Faktor) div 2; OriginalRect.Right:= OriginalRect.Right+((LupeRect.right-LupeRect.Left) divV Faktor) div 2; SelectObject(Lupe.canvas.handle,Region); BitBlt(Lupe.canvas.handle, LupeRect.Left, LupeRect.Top, LupeRect.Right, LupeRect.Bottom, Lupe.canvas.handle, 0, 0, blackness); // Damit es an den Rändern nicht zu Verzerrungen kommt StretchBlt(Lupe.canvas.handle, LupeRect.Left, LupeRect.Top, LupeRect.Right-LupeRect.Left, LupeRect.Bottom-LupeRect.Top, Original.canvas.handle, OriginalRect.Left, OriginalRect.Top, OriginalRect.Right-OriginalRect.left, OriginalRect.Bottom-OriginalRect.Top, srccopy); Lupe.Refresh; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var Region, r2, r3: Hrgn; begin Region := CreateEllipticRgn(10, 10, 200, 100); // wird diese Zeile weggelassen, dann gibt es eine rechteckige Lupe // in der Hilfe stehen einige weitere nette Möglichkeiten zu Regionen, z.B. können diese // mit CombineRgn verbunden werden, vgl. unten Lupe(image1, image2, region, Rect(10, 10, 200, 100), Point(X, Y), 2); // LupeRect sollte mit der Region übereinstimmen, sonst klappt es mit der // Zentrierung nicht DeleteObject(region); // nie vergessen, wenn eine Region erstellt wurde (* Folgender Code ergibt eine "8er"-Lupe Region := CreateEllipticRgn(0, 0, 10, 10); // Hauptsache, die Region besteht irgendwie r2 := CreateEllipticRgn(0, 0, 50, 50); r3 := CreateEllipticRgn(0, 50, 50, 100); CombineRgn(Region, r2, r3, rgn_or); Lupe(image1, image2, region, Rect(0, 0, 100, 100), Point(X, Y), 2); DeleteObject(region); DeleteObject(r2); DeleteObject(r3); *) end;