Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Bild auf TImage mit SVG Grafiken zusammenführen (Skia) (https://www.delphipraxis.net/213780-bild-auf-timage-mit-svg-grafiken-zusammenfuehren-skia.html)

fisipjm 25. Sep 2023 14:58

Bild auf TImage mit SVG Grafiken zusammenführen (Skia)
 
Hi,

ich versuche mich jetzt schon eine ganze Zeit lang an folgendem Problem.
Ich bin dabei eine Komponente zu erstellen, auf der ich ein Bild "ändern" kann. Ändern in dem Sinne, dass ich Vektorgrafiken auf diesem Bild Platzieren kann und diese auch noch verschieben und die Größe ändern kann. Funktioniert auch ganz schön.

Ich hab eine TImageControl, da lade ich ein Image rein. Dann habe ich eine TObjectList<TSkSvg>. Dort werden die Vektorgrafiken gesammelt. Ich müsste aber eine Funktion bereitstellen, die diese beiden Ebenen zusammen bringt. Also mir alles zusammen in ein Bild zu packen und mir dieses zurück zu liefern.

TskSvg hat ein Canvas. Leider arbeitet FMX scheinbar nicht mehr so mit Canvas wie die VCL :oops:
Ist das wirklich so schwierig, oder stelle ich mich einfach nur super dumm dran?

Wäre um jeden Input dankbar.
vG
PJM

fisipjm 26. Sep 2023 09:25

AW: Bild auf TImage mit SVG Grafiken zusammenführen (Skia)
 
Okay, was ich bisher habe, stark vereinfachtes Beispiel, die Scales sind normal dynamisch und passen auch.

Delphi-Quellcode:
procedure MergeSVGAndImage;
var
  DestCanvas: TCanvas;
  PositionX: Single;
  PositionY: Single;
  SVGPoint: TSkSvg;
  Image1: TImage;
  lWidth: Single;
  lHeight: Single;
  lbitmap: TBitmap;
const
  cScreenScale = 1;
begin
  Image1 := TImage.Create(nil);
  try
    Image1.Bitmap.LoadFromFile('Some/Fancy/File.jpg');

    SVGPoint := TSkSvg.Create(nil);
    try
      SVGPoint.Parent := Image1;
      SVGPoint.Svg.Source := 'SVG FILE SOURCE';
      SVGPoint.Width := 42;
      SVGPoint.Height := 42;
      SVGPoint.Position.X := 42;
      SVGPoint.Position.Y := 42;

      DestCanvas := Image1.Bitmap.Canvas;
      DestCanvas.BeginScene;

      PositionX := SVGPoint.Position.X * cScreenScale;
      PositionY := SVGPoint.Position.Y * cScreenScale;
      lWidth := SVGPoint.Width * cScreenScale;
      lHeight := SVGPoint.Height * cScreenScale;
      SVGPoint.PaintTo(DestCanvas, RectF(PositionX, PositionY, lWidth, lHeight));

      DestCanvas.EndScene;

    finally
      SVGPoint.Free;
    end;

  finally
    Image1.Free;
  end;
end;
Wenn ich damit arbeite, bekomme ich meine SVG auf das Bild gezeichnet, aber nicht an die Stelle wo ich es gerne hätte. Hab die Befürchtung ich hab die Funktion von Canvas nicht wirklich verstanden :pale:

Grüße
PJM

fisipjm 26. Sep 2023 09:40

AW: Bild auf TImage mit SVG Grafiken zusammenführen (Skia)
 
Uff :oops:
Ich stand richtig auf dem Schlauch.

Wenn man im Canvas Right und Bottom auch noch richtig setzt funktioniert es auch. So gehts jetzt:

Delphi-Quellcode:
PositionX := Measurement.SVGPoint.Position.X;
    PositionY := Measurement.SVGPoint.Position.Y;
    lWidth := Measurement.SVGPoint.Width ;
    lHeight := Measurement.SVGPoint.Height ;

    SVGPoint.PaintTo(DestCanvas, RectF(PositionX, PositionY, lWidth + PositionX, lHeight + PositionY));
Manchmal kann man sich nur an den Kopf greifen und den Kaffee eine Sufe stärker drehen.:roll:


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