![]() |
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: ![]() 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 |
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; |
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. |
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.
|
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. |
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? |
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 |
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. |
AW: Delphi XE8 Maps Marker Generieren
Brush.Style := bsClear;
|
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; |
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? |
AW: Delphi XE8 Maps Marker Generieren
Liste der Anhänge anzeigen (Anzahl: 1)
So, hat ein wenig gedauert:
Delphi-Quellcode:
Siehe auch das Beispiel zu Canvas.Draw.
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; [Edit] Was sagt den TMS Maps wie Bilder/Images zugeliefert werden sollen? Irgendwo muss doch stehen wie das mit dem Transparent gehandhabt wird. [/Edit] |
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. |
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 |
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? ![]() |
AW: Delphi XE8 Maps Marker Generieren
Zitat:
Code:
Bis bald...
Image.URL := 'data:image/'+ MimeType +';base64,' + BinStream.Base64;
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