Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi XE8 Maps Marker Generieren (https://www.delphipraxis.net/213075-delphi-xe8-maps-marker-generieren.html)

hewy 18. Mai 2023 20:55

Delphi XE8 Maps Marker Generieren
 
Liste der Anhänge anzeigen (Anzahl: 2)
Arbeite seit einiger Zeit an einer Logistik Applikation. Mit Delphi XE8 und TMS Maps.
Funktionier eigentlich wunderbar, habe aber ein Hindernis mit im Programm generierten Marker

Die Marker generiere ich mit dem hier beschriebenem Beispiel:
https://stackoverflow.com/questions/...nvas-on-delphi

Die Schwierigkeit mit der ich Kämpfe ist die Marker werden wie gewünscht erstellt nur dass ich jeweils ein Weisses Rechteck um die Marker habe. Siehe Bild im Anhang.
Vielleicht kann mir jemand eine Typ geben wich diese weisse Fläche transparent machen könnte.
Vielen Dank schon mal im Voraus
HeWy

Rollo62 19. Mai 2023 06:43

AW: Delphi XE8 Maps Marker Generieren
 
Ich arbeite nicht mit TMS Maps, dort sollte es aber ein AfterDraw geben, benutzt Du dies zum zeichnen ?

Delphi-Quellcode:
procedure TForm1.WebOSMaps1AfterDraw(Sender: TObject; ACanvas: TCanvas);
var
  MarkerPoint: TPoint;
begin
  // Perform custom drawing here
  MarkerPoint := WebOSMaps1.LatLngToScreen(PointLatLng(37.7749, -122.4194)); // Adjust the coordinates as needed

  // Draw a custom marker shape
  ACanvas.Brush.Color := clRed;
  ACanvas.Pen.Color := clBlack;
  ACanvas.Pen.Width := 2;
  ACanvas.Ellipse(MarkerPoint.X - 10, MarkerPoint.Y - 10, MarkerPoint.X + 10, MarkerPoint.Y + 10);

  // Draw custom text
  ACanvas.Font.Size := 12;
  ACanvas.Font.Style := [fsBold];
  ACanvas.Font.Color := clWhite;
  ACanvas.TextOut(MarkerPoint.X - 5, MarkerPoint.Y - 5, 'Custom Marker');
end;

hewy 19. Mai 2023 11:55

AW: Delphi XE8 Maps Marker Generieren
 
Danke Rollo64 für deine Hinweis, Bei TMS gibt es zwar ein on AfterDraw allerdings wird dies nur einmal aufgerufen beim Erstellen der Karte. Also ist es nicht das muss mal schauen ob es sowas für das Zeichnen der Marker gibt. Da der weisse Hintergrund bei meinem Marker die einzige Unschönheit ist mit der ich aktuell herum übe will ich doch versuchen dies transparent zu machen.
Vieleicht findet sich doch noch eine Lösung für die Transparenz.

Rollo62 19. Mai 2023 15:47

AW: Delphi XE8 Maps Marker Generieren
 
Nur mal geraten: Wenn dem so ist, vielleicht hilft dann ein Refresh oder Repaint oder ähnlich um das Neuzeichnen zu Triggern, falls es das bei den TMS Maps gibt.

hewy 20. Mai 2023 07:54

AW: Delphi XE8 Maps Marker Generieren
 
Nun ja geht mit onDraw nicht, die Transparency muss wirklich der Marker Graphik mitgegeben werden, da der Marker als eigene Graphik in einem Owerlay angezeigt wird und daher nicht direkter Bestandteil der Karten Graphik ist.
Aus dem gezeichneten Marker mache ich einen Base64 String kenne mich da nicht wirklich aus aber mal sehen vielleicht kann ich in diesem String vor der Übergabe zum Darstellen die Transparenten Flächen (Farbe) noch konvertieren.

himitsu 20. Mai 2023 13:01

AW: Delphi XE8 Maps Marker Generieren
 
Nja, irgendwas muß dabei als "transparent" erkannt werden.
* das könnte eine bestimmte Farbe sein,
* aber auch die Farbe eines bestimmten Pixels (die erste Ecke)
* oder z.B. ein AlphaKanals in der Farbe (32 Bit-Farbe)

Was nun aber für dieses Overlay verwendet wird, das sollte doch bestimmt in der Doku stehen?

hewy 21. Mai 2023 12:13

AW: Delphi XE8 Maps Marker Generieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für deinen Hint Himitsu,
ich übergebe einen Base64 String was auch einwandfrei funktioniert. TMS Maps Zeichnet einfach das was übergeben wird.
Übergebe ich base64 Strings, die ich mit einem separaten Graphik Programm erstellte und darin den gewünschten Bereich Transparent mache dann ist die Darstellung so wie gewünscht.
Generiere ich die Marker mit der beigefügten Funktion (Siehe Anlage) fehlt der Transparente Teil und dieser wird dann leider weiss oder was auch immer ich definiere dargestellt.
Also meine Frage wie bekomme ich meine Funktion ‘GenerateMarker’ Marker so hin dass die Blauen Marker den Weissen Bereich transparent macht?
Siehe Anhang: Blaue Ist Gelbe Soll

himitsu 21. Mai 2023 13:16

AW: Delphi XE8 Maps Marker Generieren
 
Das Bast64 ist vollkommen irrelevant, gegenüber einer binären Übergabe.
Die Übergabe per se funktioniert ja schließlich.

Es kommt also auf das drauf an, was als Daten übergeben wird.
ImageTyp und das Format.


Du wirst ja wohl nicht auf eine PaintBox malen.

Was für ein Typ hat das Bild und in welchem Format wird das Bild gespeichert.
TPngImage, TBitmap, TJPEGImage, ...
und beim Bitmap z.B. die Farbtiefe/Bits (16, 24, 32 und wie sie interpretiert werden, ala AlphaKanal) oder ob es zusätzlich eine BitMaks gibt.

Alter Mann 21. Mai 2023 13:51

AW: Delphi XE8 Maps Marker Generieren
 
Brush.Style := bsClear;

hewy 21. Mai 2023 14:13

AW: Delphi XE8 Maps Marker Generieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok habe das Ganze meiner Meinung nach auf das notwendige Minimum reduziert.
Bekomme aber immer noch die vollen Hintergrund Flächen möchte alles was clFuchsia ist transparent haben.

Delphi-Quellcode:
    Function tMarkerUtils.GenerateTriMarker(aColor: tColor): string;

    var MarkerImage: TImage;
        TransparentColor: TColor;
        Points: array of TPoint;

    begin
      MarkerImage:= TImage.Create(nil);
      try
        MarkerImage.Width:= 55;
        MarkerImage.Height:= 30;
        MarkerImage.Picture:=nil;

        TransparentColor := clFuchsia; // Background color

        MarkerImage.Canvas.Brush.Style := bsClear;
        MarkerImage.Canvas.Brush.Color:= TransparentColor;
        MarkerImage.Picture.Bitmap.TransparentColor := TransparentColor;
        MarkerImage.Picture.Bitmap.Transparent:= true;
        MarkerImage.Canvas.FillRect(Rect(0, 0, MarkerImage.Width, MarkerImage.Height));

        SetLength(Points, 3);
        Points[0] := Point(5, 5);
        Points[1] := Point(35, 5);
        Points[2] := Point(20, 20);
        MarkerImage.Canvas.Pen.Width := 2;
        MarkerImage.Canvas.Pen.Color := clBlack;
        MarkerImage.Canvas.Brush.Color := aColor;
        MarkerImage.Canvas.Polygon(Points);

        Result:= GetBase64Image(MarkerImage);
      finally
        MarkerImage.Free;
      end;
    end;

himitsu 21. Mai 2023 14:35

AW: Delphi XE8 Maps Marker Generieren
 
Da stimmt auch irgendwie garnichts.

* TImage benutzt man ausschließlich zum Anzeigen (für eine "interne" Bildgenerierung ist es nutzlos übertrieben)
* TPicture kann man verwenden, um verschiedene Formate zu verwalten
* bzw. eine TGraphic-Variable als Vorfahre für diese ImageTypen (oder eben direkt TBitmap oder sonstwas)
* MarkerImage.Picture.Bitmap erzeugt beim Zugriff im TPicture.Graphic ein TBitmap, wobei alles Vorherige gelöscht wird, wenn es vorher kein TBitmap enthielt. (Entsprechend auch Graphic.Icon ein TIcon usw. ... es wurde kein .Draw vom alten zum neuen Bild eingebaut)


MarkerImage.Canvas
und MarkerImage.Picture.Graphic.Canvas bzw. MarkerImage.Picture.Bitmap.Canvas
sind was komplett unterschiedliches.

* auf MarkerImage.Canvas greift man niemals zu, denn das ist das Canvas der temporären sichtbaren Zeichenflächen (ähnlich einer TPaintBox)
* MarkerImage.Picture.***.Canvas ist das Canvas der permanenten internen Image- Grafik-Instanz
(beim OnChange im internen Bild gibt es ein Invalidate/Repaint auf dem Sichtbaren, was Jenes neu übermalt)

Und was macht GetBase64Image?

Alter Mann 21. Mai 2023 15:27

AW: Delphi XE8 Maps Marker Generieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, hat ein wenig gedauert:

Delphi-Quellcode:
procedure TForm1.Make_MapPoint;
var
  origin, innerL, midL, midR, lft, tp, rgt, innerR : TPoint;
  radius, hgt : integer;

  BMP : TBitmap;
begin
  radius := 25;
  hgt := 90;
  origin.X := 27;
  origin.Y := 92;
  //control points
  innerL.X := origin.X;
  innerL.Y := origin.Y - (hgt - radius) div 3;
  midL.X := origin.X - radius;
  midL.Y := origin.Y - 2*((hgt - radius) div 3);
  //top circle
  lft.X := origin.X - radius;
  lft.Y := origin.Y - (hgt - radius);
  tp.X := origin.X;
  tp.Y := origin.Y - hgt;
  rgt.X := origin.X + radius;
  rgt.Y := lft.Y;
  //control points
  midR.X := origin.X + radius;
  midR.Y := midL.Y;
  innerR.X := origin.X;
  innerR.Y := innerL.Y;

  BMP := TBitmap.Create;

  with BMP do
  begin
    Width := 55;
    Height := 95;
    with Canvas do
    begin
      Brush.Color := clLime;
      Brush.Style := bsSolid;
      Pen.Color  := clBlack;
      Pen.Width  := 2;
      FillRect(Rect(0, 0, Width, Height));

      PolyBezier([origin, innerL, midL, lft]);
      Arc(lft.X, tp.Y, rgt.X, rgt.Y + radius, rgt.X, rgt.Y, lft.X, lft.Y);
      PolyBezier([rgt, midR, innerR, origin]);
      Brush.Color := clYellow;
      FloodFill(origin.X, origin.Y - radius, Canvas.Pen.Color, TFillStyle.fsBorder);
    end;
    Transparent:= true;
    TransparentColor := clWhite; // <<-Absichtlich andere Farbe als Brush.Color !!!
  end;

  PaintBox1.Canvas.Draw(2, 2, BMP);

  BMP.TransparentMode := tmAuto;

  PaintBox1.Canvas.Draw(100, 50, BMP);

  BMP.Free;

end;
Siehe auch das Beispiel zu Canvas.Draw.

[Edit]

Was sagt den TMS Maps wie Bilder/Images zugeliefert werden sollen?
Irgendwo muss doch stehen wie das mit dem Transparent gehandhabt wird.
[/Edit]

hewy 22. Mai 2023 09:57

AW: Delphi XE8 Maps Marker Generieren
 
Vielen Dank 'Alter Mann', Hast Dir einiges an Arbeit geleistet, Funktioniert soweit muss nun mit TMS prüfen was für deren Map Komponente geht.
Geben dann hier Bescheid wie ich es schlussendlich lösen konnte.

hewy 23. Mai 2023 16:50

AW: Delphi XE8 Maps Marker Generieren
 
Lösung gefunden, mit dem Code Beispiel von ‘Alter Mann’, das BitMap Resultat in ein png Format umwandeln und daraus ein Base64 String erstellen.
png := TPngImage.Create;
png.Assign( BMP );
Result := GetBase64Image(png);
Das wird von TMS FNC PAPS so korrekt mit den gewünschten transparenten Flächen angezeigt
Danke nochmals

TiGü 24. Mai 2023 07:32

AW: Delphi XE8 Maps Marker Generieren
 
Ich raff das mit dem Base64-String nicht.
Warum solltest du diesen Umweg gehen? Schickst du das per Netzwerk irgendwo hin?
In der groben Übersichtsdoku steht nichts von Base64?
https://download.tmssoftware.com/doc...cmaps/#markers

mytbo 24. Mai 2023 15:34

AW: Delphi XE8 Maps Marker Generieren
 
Zitat:

Zitat von TiGü (Beitrag 1522744)
Ich raff das mit dem Base64-String nicht.

Vorweg, ich kenne die Komponente nicht. In der Beschreibung steht als Voraussetzung TTMSFNCWebBrowser. Vermutlich steuert die Komponente Services, wie z.B. Google Maps, die in einem Browser-Fenster laufen. Ein Image in HTML lässt sich mit folgenden Schema füllen:
Code:
Image.URL := 'data:image/'+ MimeType +';base64,' + BinStream.Base64;
Bis bald...
Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 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