Bildausschnitt aus einem TImage in einem anderen TImage vergrößert darstellen bzw. zoomen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
ps4711
Beiträge: 16
Registriert: Mi 1. Dez 2021, 13:39
OS, Lazarus, FPC: Lazarus 2.2.0 // FPC 3.2.2 x86_64-linux-gtk2 // xubuntu 22.04
CPU-Target: 64Bit

Bildausschnitt aus einem TImage in einem anderen TImage vergrößert darstellen bzw. zoomen

Beitrag von ps4711 »

Ich möchte mit der Maus über Image1 fahren und einen Bildausschnitt um die Maus in Image2 vergrößert darstellen.

Im Internet habe ich einen Ansatz mit TRect gefunden, aber den verstehe ich anscheinend nicht, da es so aussieht als ob das gesamte Image1 in Image2 stark verkleinert dargestellt wird. :?

Es folgt der gesamte Code von Image1MouseMove ... die Zeilen die es betrifft habe ich mit

Code: Alles auswählen

//!!!!!!!!!!!!!!!!!!!!
markiert. Ich hoffe das ist übersichtlicher.

Code: Alles auswählen

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  oldPenMode : TFPPenMode;
  oldPenColor : TColor;
  ImageRect : TRect; //!!!!!!!!!!!!!!!!!!!!
begin
  with image1 do
  begin
    oldPenColor := Canvas.Pen.Color;
    oldPenMode := Canvas.Pen.Mode;
    Canvas.Pen.Color := clred;
    Canvas.Pen.Mode := pmXor;

    if deleteReticle then
    begin
      Canvas.Line(0,oldY,Canvas.Width,oldY);
      Canvas.Line(oldX,0,oldX,Canvas.Height);
    end
    else
      deleteReticle := true;

    if isNewLine then
      if deleteLine then
            Canvas.Line(NLX1,NLY1,oldX,oldY)
      else
        deleteLine := true;

    oldX := X;
    oldY := Y;

    Canvas.Line(0,Y,Canvas.Width,Y);
    Canvas.Line(X,0,X,Canvas.Height);
    if isNewLine Then
        Canvas.Line(NLX1,NLY1,X,Y);

    Canvas.Pen.Color := oldPenColor;
    Canvas.Pen.Mode := oldPenMode;

    //!!!!!!!!!!!!!!!!!!!!
    ImageRect := Rect(X-10,Y-10, X+10, Y+10); //!!!!!!!!!!!!!!!!!!!!
    Image2.Canvas.StretchDraw(ImageRect, Image1.Picture.Bitmap); //!!!!!!!!!!!!!!!!!!!!
    //!!!!!!!!!!!!!!!!!!!!

  end;
end;
Ich habe das so verstanden, das ImageRect ein Rechteck definiert und mit dem Befehl

Code: Alles auswählen

Image2.Canvas.StretchDraw(ImageRect, Image1.Picture.Bitmap);
eben diese Rechteckschablone auf Image2 angewandt wird und mittels StretchDraw auf die größe von Image2 gezoomt wird.

Wo ist mein Denkfehler?

Vielen Dank schon einmal für eure Hilfe.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Bildausschnitt aus einem TImage in einem anderen TImage vergrößert darstellen bzw. zoomen

Beitrag von wp_xyz »

In der Deklaration von StretchDraw ist das Rechteck als "DestRect" bezeichnet, also das Zielrechteck. So wie ich dein Problem verstehe, hast du an dieser Stelle in der Argumentliste von StretchDraw aber das "SourceRect" eingetragen, also das Ausgangsrechteck, und das Zielrechteck wäre die gesamte Größe des anderen TImage. Du brauchst also zwei Rechtecke in dem Aufruf. Genau das macht TCanvas.CopyRect:

Code: Alles auswählen

procedure CopyRect(const Dest: TRect; SrcCanvas: TCanvas; const Source: TRect); 
Dest wäre das vom Ziel-Image aufgespannte Rechteck, Source das mit der Maus gezeichnete Rechteck (ImageRect) und SrcCanvas wäre der Canvas des Ausgangsbildes. Das ganze muss dann vom Zielbild aufgerufen werden:

Code: Alles auswählen

Image2.Canvas.CopyRect(Rect(0, 0, Image2.Width, Image2.Height), Image1.Canvas, ImageRect);

wennerer
Beiträge: 518
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Bildausschnitt aus einem TImage in einem anderen TImage vergrößert darstellen bzw. zoomen

Beitrag von wennerer »

Hallo,
es gab hier vor einiger Zeit ein schönes Beispiel von wp_xyz:
viewtopic.php?p=104190#p104190

Ich hab gelesen das du unter Linux bist. Ich musste es damals unter gtk2 etwas anpassen das es lief. Ich habe es eben noch mal getestet.
Bei mir läuft es unter Linux Mint mit gtk2.

Viele Grüße
Bernd
Dateianhänge
project1.zip
(17.66 KiB) 128-mal heruntergeladen

ps4711
Beiträge: 16
Registriert: Mi 1. Dez 2021, 13:39
OS, Lazarus, FPC: Lazarus 2.2.0 // FPC 3.2.2 x86_64-linux-gtk2 // xubuntu 22.04
CPU-Target: 64Bit

Re: Bildausschnitt aus einem TImage in einem anderen TImage vergrößert darstellen bzw. zoomen

Beitrag von ps4711 »

wp_xyz hat geschrieben:
So 12. Dez 2021, 23:53
...

Code: Alles auswählen

Image2.Canvas.CopyRect(Rect(0, 0, Image2.Width, Image2.Height), Image1.Canvas, ImageRect);
Genau das war es. Vielen Dank!
wennerer hat geschrieben:
Mo 13. Dez 2021, 18:00
...
Ich hab gelesen das du unter Linux bist. Ich musste es damals unter gtk2 etwas anpassen das es lief. Ich habe es eben noch mal getestet.
Bei mir läuft es unter Linux Mint mit gtk2.
...
Danke für den Hinweis bzw. dein Projekt. Bei mir hat der Code von wp_xyz out of the box funktioniert. Wenn ich das richtigsehe benutzt mein Programm auch GTK2

Code: Alles auswählen

$ ldd pdfmessen | grep gtk
	libgtk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 (0x00007fc009434000)
Von daher hat das ohne anpassungen funktioniert.

Danke nochmal euch beiden.

Antworten