Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Mehrere Markierungen in TImage setzen (https://www.delphipraxis.net/89105-mehrere-markierungen-timage-setzen.html)

RonaldMauthe 26. Mär 2007 13:35


Mehrere Markierungen in TImage setzen
 
Hallo,

wie kann ich mehrere Markierungen (z.B. Kreise) in ein TImage setzen?

Aktueller Stand: Der User lädt ein beliebiges Bild in ein TImage Control.
Neue Funktion: Der User soll Markierungen im Bild setzen können.

Ich möchte folgende Funktionen haben:

Button1 = Neue Markierung setzen (grün)
Button2 = Neue Markierung setzen (blau)
Button3 = Markierung löschen

Bei Klick auf einen Button wird die Markierung in die Mitte des Bildes gesetzt. Der User kann die Markierung mit der Maus bewegen und neu positionieren.

Es können pro Bild maximal 7 Markierungen möglich sein.

Wenn der User auf eine Markierung klickt, soll sie hervorgehoben werden (damit man erkennt, welche Markierung aktiv ist).

Mit dem Button "Markierung löschen" soll die aktive Markierung gelöscht werden.

Das ganze Bild mit allen Markierungen soll auch gedruckt werden.

Hat da jemand einen Ansatz für mich (oder einen fertigen Code)

Vielen Dank für eure Hilfe,
Ronald

turboPASCAL 26. Mär 2007 14:01

Re: Mehrere Markierungen in TImage setzen
 
Schau mal in der hilfe nach unter:

Delphi-Referenz durchsuchenTImage Delphi-Referenz durchsuchenTBitmap Delphi-Referenz durchsuchenTCanvas

Delphi-Quellcode:
procedure SoUndSo...
begin
  With ImageX.Picture.Bitmap do
  begin
    Canvas.Brush.Style := bsClear
    Canvas.Pen.Color := clGreen;
    Canvas.Rectangle(x,y,x2,y2);
  end;
end;
Bei Markierung löschen musst du entweder einen Teilbereich aus einem temp. Bitmap kopieren
oder du lädst nas komplette bitmap neu und mals alle anderen Markierungen.

RonaldMauthe 26. Mär 2007 14:17

Re: Mehrere Markierungen in TImage setzen
 
Hallo Matti,

für die statische Anzeige ist das sicher eine gute Sache, aber der User soll die Markierung ja auch verschieben können.
Dann müsste ich bei der Lösung erst das Bild neu laden (um alle Markierungen zu löschen), dann alle alten Markierungen neu zeichnen und die aktuelle Markierung an die Mausposition setzen. Und den ganzen Vorgang bei jeder Mausbewegung erneut. Das wird dann wohl ziemlich flackern.

Gibt es denn für das Verschieben der Markierung noch eine andere Möglichkeit ?

Gruß,
Ronald

Hawkeye219 26. Mär 2007 14:31

Re: Mehrere Markierungen in TImage setzen
 
Willkommen in der Delphi-PRAXiS, Ronald!

Du könntest für die zu verschiebenden Punkte jeweils ein Delphi-Referenz durchsuchenTShape nehmen:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    [...]
  private
    FMarker : TShape;
    FAnchor : TPoint;
    FOrgPos : TPoint;
    FPanning : Boolean;
    function CreateMarker (aColor: TColor): TShape;
  end;

[...]

CONST
  SHAPESIZE = 15;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FMarker := CreateMarker(clLime);
end;

function TForm1.CreateMarker(aColor: TColor): TShape;
begin
  Result := TShape.Create(Self);
  with Image1 do
    Result.SetBounds(Left + (Width - SHAPESIZE) div 2,
                     Top + (Height - SHAPESIZE) div 2, SHAPESIZE, SHAPESIZE);

  Result.Parent := Self;
  Result.Shape := stCircle;
  Result.Brush.Color := aColor;
  Result.OnMouseDown := ShapeMouseDown;
  Result.OnMouseMove := ShapeMouseMove;
  Result.OnMouseUp := ShapeMouseUp;
end;

procedure TForm1.ShapeMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FAnchor := Mouse.CursorPos;
  FOrgPos := TShape(Sender).BoundsRect.TopLeft;
  FPanning := True;
end;

procedure TForm1.ShapeMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FPanning then
    begin
      TShape(Sender).Top := FOrgPos.Y + (Mouse.CursorPos.Y - FAnchor.Y);
      TShape(Sender).Left := FOrgPos.X + (Mouse.CursorPos.X - FAnchor.X);
    end;
end;

procedure TForm1.ShapeMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FPanning := False;
end;
Das ist natürlich nur ein Anfang. Die Verwaltung der Shapes (Speichern der Referenzen, Begrenzung der Anzahl, Einfärben beim Anklicken, Löschen) sowie eine eventuelle Einschränkung der Mausbewegung mußt du noch ergänzen.

Gruß Hawkeye

turboPASCAL 26. Mär 2007 14:35

Re: Mehrere Markierungen in TImage setzen
 
[quote="RonaldMauthe"]Hallo Matti,

für die statische Anzeige ist das sicher eine gute Sache, aber der User soll die Markierung ja auch verschieben können.
Dann müsste ich bei der Lösung erst das Bild neu laden (um alle Markierungen zu löschen), dann alle alten Markierungen neu zeichnen und die aktuelle Markierung an die Mausposition setzen. Und den ganzen Vorgang bei jeder Mausbewegung erneut. Das wird dann wohl ziemlich flackern.
Wenn man es richtig macht nicht.
- Das Bild neu laden ist schlecht, kopieren ist besser.
- Die Koordinaten in einem Array zwischenspeichern.

Zitat:

Zitat von RonaldMauthe
Gibt es denn für das Verschieben der Markierung noch eine andere Möglichkeit ?

Du kannst in einem darüberliegendem Image (transparent) die Markierungen setzen (für die Schnelle :mrgreen: )

SirThornberry 26. Mär 2007 14:59

Re: Mehrere Markierungen in TImage setzen
 
nur mit EINEM TImage wird es nicht gehen. Denn ein TImage ist zur Anzeige EINES Bildes gedacht. Und Bilder haben die Eigenschaft, wie ein Blatt Papier, das man drau malen kann aber das was man mit dem stift gemalt hat kann man auf einem Blatt nicht verschieben.

RonaldMauthe 27. Mär 2007 08:23

Re: Mehrere Markierungen in TImage setzen
 
Vielen Dank für die Hilfe, bin damit weitergekommen.
Gruß,
Ronald


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz