AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bild in Image mit der Maus verschieben
Thema durchsuchen
Ansicht
Themen-Optionen

Bild in Image mit der Maus verschieben

Ein Thema von ReDoX · begonnen am 3. Mär 2005 · letzter Beitrag vom 28. Sep 2014
 
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#5

AW: Bild in Image mit der Maus verschieben

  Alt 2. Sep 2014, 22:16
Kurz vor dem zehnjährigen Jubiläum dieses Themas hat mir der Code von Haris noch einmal sehr geholfen. Mein Problem war etwas anders gelagert:

In einem TImage mit einer Breite von ca. 1.700 Pixeln wird ein JPG mit ca. 4.900 Pixeln Kantenlänge proportional verkleinert angezeigt. Ich möchte nun, dass (wie z.B. bei Faststone) beim Klicken auf eine Stelle im TImage das JPG in nativer Auflösung (1:1) angezeigt wird, und dass genau die angeklickte Stelle unter dem Mauszeiger eingestellt wird. Außerdem soll sich das native JPG beim Bewegen mit gedrückter Maustaste mit bewegen, und zwar proportional; das heißt, dass beim Durchfahren der 1.700 Pixel des TImages mit der Maus die ganzen 4.900 Pixel des nativen JPG durchfahren (also angezeigt) werden. Analog das Ganze natürlich auch vertikal.

Der folgende Code leistet genau das. Aus gegebenem Anlass weise ich darauf hin, dass es sich hier nur um ein Gerüst und nicht um fertigen Code handelt. Die Freigabe der Ressourcen muss natürlich beim Schließen der Form erfolgen.

Anmerkungen:
Das Schnellste, was ich bisher zum Dekodieren von JPEG gefunden habe, ist "jpegdec", das jetzt von Arnaud Bouchez gepflegt wird; die Anpassung für Delphi findet sich beispielsweise hier.
Für JPG, die kleiner sind als das TImage, müsste der Code noch angepasst werden.

Delphi-Quellcode:
type
Image1 : TImage;

var
  MausStartPos : TPoint;
  AktBmp : TBitmap;
  TempBmp : TBitmap;
  BildFaktorH : Single;
  BildFaktorV : Single;
  MS : TMemoryStream;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TempBmp := TBitmap.Create;
  TempBmp.PixelFormat := pf32bit;
  AktBmp := TBitmap.Create;
  AktBmp.PixelFormat := pf32bit;
  MS := TMemoryStream.Create;
end;

function TForm1.LadeBildInBMP(Datname:string):Boolean;
begin
  Try
    MS.LoadFromFile(Datname);
    AktBmp := JpegDecode(MS.Memory,MS.Size);
  Except
    FreeAndNil(AktBmp);
  End;
  Result := (AktBmp <> nil);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  If ssLeft in Shift then begin
    TempBmp.Width := AktBmp.Width;
    TempBmp.Height := AktBmp.Height;
    TempBmp.Canvas.Brush.Color := clBlack;
    TempBmp.Canvas.FillRect(Rect(0,0,TempBmp.Width,TempBmp.Height));
    TempBmp.Canvas.Draw(0,0,TempBmp);
    Form1.Canvas.Draw(0,0,TempBmp);
    BildFaktorH := -(TempBmp.Width - Image1.Width) / Image1.Width;
    BildFaktorV := -(TempBmp.Height - Image1.Height) / Image1.Height;
    MausStartPos := Point(Round(x * BildFaktorH),Round(y * BildFaktorV));
    // Anzeigen
    TempBmp.Canvas.FillRect(Rect(0,0,TempBmp.Width,TempBmp.Height));
    TempBmp.Canvas.Draw(MausStartPos.X,MausStartPos.Y,AktBmp);
    Form1.Canvas.Draw(0,0,TempBmp);
  end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  If ssLeft in Shift then begin
    TempBmp.Canvas.Brush.Color := clBlue;
    TempBmp.Canvas.FillRect(Rect(0,0,TempBmp.Width,TempBmp.Height));
    TempBmp.Canvas.Draw(MausStartPos.X,MausStartPos.Y,AktBmp);
    Form1.Canvas.Draw(0,0,TempBmp);
    MausStartPos := Point(Round(x * BildFaktorH),Round(y * BildFaktorV));
  end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Image1.Picture.Bitmap := AktBmp;
  TempBmp.Width := 0;
end;

Geändert von Benmik ( 2. Sep 2014 um 23:31 Uhr) Grund: Link für jpegdec.pas hinzugefügt
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz