Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie? (https://www.delphipraxis.net/177710-firemonkey-inhalte-von-tlayer3d-als-bild-speichern-wie.html)

torud 22. Nov 2013 12:24

Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Hallo Wissende,

ich bin gerade dabei mich etwas mit Firemonkey zu beschäftigen. Ich weiss nicht, ob meine Herangehensweise korrekt ist, aber ich habe auf ein 3d-Form einen TLayer3D platziert und darauf ein Bild und ein Textobjekt platziert. Nun würde ich gern dieses Szenario als Bild speichern - am Besten als PNG mit Transparenz.

Delphi-Quellcode:
Layer3D1.Canvas.Bitmap.SaveToFile('c:\temp\test.bmp');
Damit erhalte ich aber nur ein Schwarzes Bild in der Größe des Layers.

Wie könnte ich das also machen? Der Plan ist dynamisch auf dem Formular oder dem Layer Bilder und Texte zu platzieren und dann ein Bild davon zu erstellen. Geht das überhaupt und wenn ja, WIE?

Uwe Raabe 22. Nov 2013 12:58

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Delphi Version? (Delphi 7 wohl eher nicht)

torud 22. Nov 2013 13:11

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Ups, sorry - XE2 oder XE5 wären möglich.

Uwe Raabe 22. Nov 2013 13:22

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Vielleicht kommst du mit TLayer3D.PaintToBitmap weiter.

torud 22. Nov 2013 13:32

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Jo, das geht zwar, aber krieg einfach nur ein scharzes Bild.

Delphi-Quellcode:
var
  bmp : TBitmap;
begin
  bmp := TBitmap.Create;
  Layer3D1.PaintToBitmap(bmp, 1024, 576, $FF000000);
  bmp.SaveToFile('c:\temp\test.bmp');
  bmp.Free;

mkinzler 22. Nov 2013 13:52

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Delphi-Quellcode:
var
  bmp : TBitmap;
begin
  bmp := TBitmap.Create( Layer3D1.Width, Layer3D1.Height);
  Layer3D1.PaintToBitmap(bmp, 1024, 576, $FF000000);
  bmp.SaveToFile('c:\temp\test.bmp');
  bmp.Free;

Uwe Raabe 22. Nov 2013 14:08

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Abgesehen von der Füllfarbe wäre das eigentlich die richtige Methode - wenn sie denn funktionieren würde...

torud 22. Nov 2013 14:57

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Zitat:

Zitat von mkinzler (Beitrag 1237068)
Delphi-Quellcode:
var
  bmp := TBitmap.Create( Layer3D1.Width, Layer3D1.Height);

Leider ist es nicht möglich das Erzeugen des Bitmaps mit den 2 Parametern zu versehen. Was mache ich falsch?

Die Füllfarbe habe ich eigentlich aus unit System.UITypes übernommen. Welcher Wert wäre denn sonst gültig und warum funktioniert das Ganze nicht?

Thom 22. Nov 2013 15:15

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Brobier's mal mit Layer3D1.Buffer - also Layer3D1.Buffer.SaveToFile(...). PaintToBitmap funktioniert - wie schon angemerkt - leider nicht.

Uwe Raabe 22. Nov 2013 15:43

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Zitat:

Zitat von torud (Beitrag 1237078)
Zitat:

Zitat von mkinzler (Beitrag 1237068)
Delphi-Quellcode:
var
  bmp := TBitmap.Create( Layer3D1.Width, Layer3D1.Height);

Leider ist es nicht möglich das Erzeugen des Bitmaps mit den 2 Parametern zu versehen. Was mache ich falsch?

Ist auch nicht nötig, da die Bitmap innerhalb PaintToBitmap sowieso mit SetSize angepasst wird.

Zitat:

Zitat von torud (Beitrag 1237078)
Die Füllfarbe habe ich eigentlich aus unit System.UITypes übernommen. Welcher Wert wäre denn sonst gültig und warum funktioniert das Ganze nicht?

Die Füllfarbe entspricht TAlphaColorRec.Alpha, was streng genommen eigentlich gar keine Farbe ist. Du kannst ja erst mal eine normale Farbe nehmen, wie white oder silver, bevor du dich an die Transparenz wagst.

Warum es nicht funktioniert, kann ich dir auch nicht sagen. Ich bekomme manchmal zwar etwas in die Bitmap, wenn die Projektion auf Camera steht, aber nicht ganz das was ich will. Ich habe aber jetzt auch keine Zeit den Fehler zu suchen.

torud 22. Nov 2013 16:42

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Zitat:

Zitat von Thom (Beitrag 1237081)
Brobier's mal mit Layer3D1.Buffer.SaveToFile(...).

Volltreffer!
Ging auch direkt als png mit Alpha.

Hm, leider bekomme ich es nicht noch einmal hin. Ich hatte auf dem Layer ein normales Image liegen und ein Textobjekt. Das Image wurde korrekt in dem ausgegebenen png angezeigt. Der Text wurde nicht übernommen. Gibts vielleicht noch irgendwelche Tricks, welche Controls worauf zu platzieren sind und welche Einstellungen man vornehmen muss? Kann man irgendwo auch was nachlesen oder hat jemand von Euch damit weitere Erfahrungen gemacht?

Thom 22. Nov 2013 16:52

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Meinst Du mit Textobjekt ein TText3D? Falls Ja: Versuch lieber ein normales TLabel-Objekt. Der Buffer enthält alle 2D-Unterobjekte von TLayer3D, die dann als Textur während des eigentlichen Renderprozesses auf ein einfaches Rechteck gelegt werden. Alle 3D-Unterobjekte werden separat gerendet und das führt mit PaintToBitmap momentan leider nicht zum gewünschten Ergebnis.

torud 22. Nov 2013 17:48

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also irgendwas muss ich jetzt falsch machen, denn ich erhalte nur noch leere Bilder.
Ich musste leider das Projekt nochmal neu erstellen, da XE5 abgeschmiert war.

Seitdem kriege ich es einfach nicht mehr hin, dass es funktioniert.
Kann jemand bitte mal einen prüfenden Blick drauf werfen?

Thom 22. Nov 2013 18:40

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir funktioniert eine etwas abgewandelte Version: Das Bild wird erst nach Betätigung eines Buttons aus dem Layer ausgelesen. Wenn Du den Buffer schon in Form3DShow verwendest, ist er noch leer, da das Bild selbst noch nicht auf dem Formular gerendert wurde.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image2.Bitmap:=Layer3D1.Buffer;
end;
Anhang 40212

torud 22. Nov 2013 19:48

AW: Firemonkey - Inhalte von TLayer3D als Bild speichern - Wie?
 
That´s it my Dear!

Wenn man dann noch die Eigenschaft Transparency auf True stellt, gibts ein png-Bild samt Alpha. Genau das was ich wollte.
Jetzt muss ich nur noch herausfinden, ob sowas wie Schatten, Outlines und Blurs auf Bilder und Texte geht. Der Anfang ist gemacht!


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