Hallo,
mein Problem ist weniger ein Delphi-Programmier-Problem als ein mathematisches Problemchen, bei dem ich irgendwie "ein Brett vor dem Kopf" habe.
Ich habe eine Form (Form1) auf der lediglich ein Image (Image1) mit einem JPG-Bild ist. Mit dem Mausrad kann ich den Zoomfaktor (globale Variable _Zoom) des Bildes zwischen den Variablen _Min (z.B. 0.10) und _Max (z.B. 3.00) in Schritten zu 0.01 einstellen. Und per linker Maustaste kann ich das Bild innerhalb der Form verschieben.
Dabei gelten folgende Konventionen:
- Das Verhaltnis Image1.Width : Image1.Height ist immer gleich dem Verhältnis Jpg.Width : jpg.Height
- Wenn eine Seite außerhalb der Form liegt, so liegt die gegenüberliegende Seite entweder ebenfalls außerhalb der Form oder am Rand der Form, aber keinesfalls innerhalb.
- Wenn eine Seite innerhalb der Form liegt, so liegt die gegenüberliegende Seite entweder ebenfalls innerhalb der Form oder am Rand der Form, aber keinesfalls außerhalb.
Hier die Routine für die Mouse-Events auf dem Image:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
_OldX := X;
_OldY := Y;
if Button = mbLeft then
_IsDown := True;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
NewX : Integer;
NewY : Integer;
begin
if _IsDown then
begin
NewX := Image1.Left + X - _OldX;
NewY := Image1.Top + Y - _OldY;
if Image1.Width < Form1.ClientWidth then
begin
if NewX < 0 then
NewX := 0;
if (NewX + Image1.Width) > Form1.ClientWidth then
NewX := Form1.ClientWidth - Image1.Width;
end
else
begin
if (X < _OldX) and ((NewX + Image1.Width) < Form1.ClientWidth) Then
NewX := Form1.ClientWidth - Image1.Width;
if (X > _OldX) and (NewX > 0) Then
NewX := 0;
end;
if Image1.Height < Form1.ClientHeight then
begin
if NewY < 0 then
NewY := 0;
if (NewY + Image1.Height) > (Form1.ClientHeight) then
NewY := Form1.ClientHeight - Image1.Height;
end
else
begin
if (Y < _OldY) and ((NewY + Image1.Height) < (Form1.ClientHeight)) Then
NewY := Form1.ClientHeight - Image1.Height;
if (Y > _OldY) and (NewY > 0) Then
NewY := 0;
end;
Image1.Left := NewX;
Image1.Top := NewY;
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
_IsDown := False;
end;
Wie kann ich jetzt den Bereich des Bildes, den ich in der Form sehe, in eine neue jpg-Komponente kopieren?
a) unter Berücksichtigung des Zoomfaktors (also in Originalgröße)
b) ohne Berücksichtigung des Zoomfaktors (also in der angezeigten Größe)
Schonmal Danke für Eure Hilfe und Gruß aus Köln.
Thomas