7

処理を使用してサーバー側で視覚化をレンダリングしたいと思います(ヘッドレス、GUIなし)。処理スケッチは静的である(つまり、アニメーション化されない)ため、最初のフレームを取得するだけで済みます。この結果をWebアプリケーションのユーザーにオンデマンドで提供したいと思います。

私はprocessing.orgフォーラムで少し検索しましたが、Processingはヘッドレスで起動することを意図していないことが示唆されています。私が見た唯一のハックは、ヘッドレスX11ディスプレイの起動を伴うものです。

Xvfb :2 &
export DISPLAY=":2"
./myapp
killall -9 Xvfb

..純粋なJavaソリューションが必要であり、サーバー側のXレンダラーを常に保証できるとは限らないため、これは機能しません。

純粋なJavaでこれを行うにはどうすればよいですか?

4

3 に答える 3

1

XvfbはJavaレンダラーよりも高速である可能性が高く、ハードウェアアクセラレーションされたXサーバーが大幅に高速になりますが、「純粋な」Javaソリューションが必要な場合は、 Pure JavaAWTToolkitを試すことができます。

編集:ここから持ち上げられたブートコマンドラインの例は次のとおりです:

java -Xbootclasspath:JDK/jre/lib/rt.jar:LIB/pja.jar -Dawt.toolkit=com.eteks.awt.PJAToolkit -Djava.awt.graphicsenv=com.eteks.java2d.PJAGraphicsEnvironment -Djava.awt.fonts=JDK/jre/lib/fonts mainclassname args
于 2010-06-22T14:23:12.750 に答える
1

標準のヘッドレスJavaアプリを作成し、その中にPGraphicsオブジェクトを作成して(1)、その上ですべての描画操作を実行します。次に、.save()を使用して、PGraphicsオブジェクトをイメージファイルとしてディスクに保存します。

1これはPAppletから入手する必要があるかもしれませんが、直接作成できるかどうかはわかりません。

コードは次のようなモード以下になります。

PApplet applet = new PApplet();
PGraphics g = applet.createGraphics(200, 400, PApplet.JAVA2D) // same params as size()
g.beginDraw();
g.ellipse // ... etc, your drawing goes here
g.endDraw();
g.save("filename.png");
于 2011-05-11T19:43:44.527 に答える
0

のコンストラクターが環境がヘッドレスであるかどうかをチェックするため、OllieGlassのソリューションは機能しなくなりました。PApplet/Applet-Djava.awt.headless=true

したがって、そもそもPAppletオブジェクトを作成する方法はありません。

代わりに、PGraphics直接作成してください。たとえば、すべてをPDFに描画するには

PGraphics pdf = new PGraphicsPDF();
pdf.setPrimary(false);
pdf.setPath(filename);
pdf.setSize(sizeX, sizeY);
// pdf.setParent(new PApplet()); This is intentionally NOT called.

pdf.beginDraw();

// draw everything

pdf.dispose();
pdf.endDraw();

基になるものがいくつかのヘルパーメソッドに対してその( )をPGraphics呼び出すため、テキストを追加しても例外がスローされます。ただし、そもそもを作成することは許可されていないため、これは設定されていません。parentPAppletPApplet

解決策は、これらの関数呼び出しを取り除くことです。独自のバージョンのを作成しますPGraphicsPDF。例えば

class MyPGraphicsPDF extends PGraphicsPDF{

    @Override
    public float textAscent() {
        if (textFont == null) {
          defaultFontOrDeath("textAscent");
        }

        Font font = (Font) textFont.getNative();
        //if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) {
        if (font != null) {
          FontMetrics metrics = this.getFontMetrics(font);
          return metrics.getAscent();
        }
        return super.textAscent();
      }

    @Override
      public float textDescent() {
        if (textFont == null) {
          defaultFontOrDeath("textDescent");
        }
        Font font = (Font) textFont.getNative();
        //if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) {
        if (font != null) {
          FontMetrics metrics = this.getFontMetrics(font);
          return metrics.getDescent();
        }
        return super.textDescent();
      }

    public FontMetrics getFontMetrics(Font font) {
        FontManager fm = FontManagerFactory.getInstance();
        return sun.font.FontDesignMetrics.getMetrics(font);
    }
}

textAscent()およびは、存在しないから呼び出さないように変更されたtextDescent()からのコードのコピーです。代わりに、両方とも、欠落しているヘルパーメソッドをわずかに短いバージョンとして再実装する3番目のメソッドにリダイレクトします。PGraphicsgetFontMetrics(Font font)parent PAppletPAppletjava.awt.Component.getFontMetrics(Font font)

お役に立てば幸いです。

製図板としてファイルを明示的に呼び出す場合は、ネイティブのヘッドレスバージョンの処理があれば便利です。

于 2014-10-15T13:25:40.803 に答える