Ich möchte mit Processing eine Visualisierung auf der Serverseite rendern (kopflos, mit no GUI ). Die Verarbeitungsskizze ist statisch (d. H. Animiert nicht), daher muss ich nur den ersten Frame erfassen und dieses Ergebnis möchte ich den Benutzern unserer Webanwendung bei Bedarf bereitstellen.
Ich habe ein wenig in den processing.org-Foren gesucht und es wurde vorgeschlagen, dass die Verarbeitung nicht kopflos gestartet werden soll. Der einzige Hack, den ich gesehen habe, ist der Aufruf eines Headless-X11-Displays:
%Vor%.. Was für uns nicht funktioniert, da wir eine reine Java-Lösung haben möchten und nicht immer einen X-Renderer auf der Serverseite garantieren können.
Wie mache ich das in reinem Java?
Xvfb ist wahrscheinlich schneller als ein Java-Renderer, und ein hardwarebeschleunigter X-Server wird mit großem Abstand am schnellsten sein, aber wenn Sie eine "reine" Java-Lösung wollen, können Sie das Pure Java AWT Toolkit .
EDIT: Hier ist ein Boot-Befehlszeilenbeispiel, das hier aufgerufen wurde:
%Vor%Erstellen Sie eine standardmäßige kopflose Java-App, erstellen Sie darin ein PGraphics-Objekt (1) und führen Sie alle Ihre Zeichenoperationen dafür aus. Dann speichern Sie das PGraphics-Objekt als Image-Datei mit .save ().
auf der Festplatte1 Möglicherweise müssen Sie dies von einem PApplet erhalten, ich bin mir nicht sicher, ob Sie es direkt erstellen können.
Der Code sieht wie folgt aus:
%Vor% Die Lösung von Ollie Glass funktioniert nicht mehr, da der Konstruktor von PApplet/Applet
prüft, ob die Umgebung kopflos ist oder nicht , zB -Djava.awt.headless=true
.
Es gibt also keine Möglichkeit, ein PApplet-Objekt an erster Stelle zu erstellen.
Erstellen Sie stattdessen Ihre PGraphics
direkt. Zum Beispiel, um alles in eine PDF zu zeichnen
Das Hinzufügen von Text löst weiterhin eine Ausnahme aus, da das zugrunde liegende PGraphics
für einige Hilfsmethoden sein parent
(das PApplet
) aufruft. Dies wurde jedoch nicht festgelegt, da es nicht erlaubt ist, ein PApplet
an erster Stelle zu erstellen.
Eine Lösung besteht darin, diese Funktionsaufrufe loszuwerden, indem Sie Ihre eigene Version von PGraphicsPDF
erstellen. Zum Beispiel
textAscent()
und textDescent()
sind Kopien des Codes von PGraphics
mit der Änderung, dass getFontMetrics(Font font)
nicht von der nicht existierenden parent
PApplet
aufgerufen wird. Stattdessen werden beide auf die dritte Methode umgeleitet, die die fehlende Hilfsmethode von PApplet
als etwas kürzere Version von java.awt.Component.getFontMetrics(Font font)
erneut implementiert.
Ich hoffe, das hilft.
Wäre schön, eine native kopflose Version der Verarbeitung zu haben, wenn Sie explizit eine Datei als Zeichenbrett aufrufen.
Tags und Links java image-processing data-visualization processing server-side