Сохраните эскиз обработки в файл PNG на стороне сервера без графического интерфейса или дисплея - PullRequest
7 голосов
/ 22 июня 2010

Я хотел бы использовать Processing для визуализации на стороне сервера (без заголовка, с без GUI ). Эскиз Обработка является статической (то есть не анимированной), поэтому мне нужно только захватить первый кадр, и я хотел бы предоставить этот результат пользователям нашего веб-приложения по запросу.

Я немного обыскал форумы processing.org, и было высказано предположение, что обработка не предназначена для запуска без головы. Единственный взлом, который я видел, это запуск безголового дисплея X11:

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

.. Что не будет работать для нас, так как мы хотели бы иметь решение на чистом Java и не всегда можем гарантировать рендерер X на стороне сервера.

Как мне это сделать на чистом Java?

Ответы [ 3 ]

1 голос
/ 11 мая 2011

Создайте стандартное приложение Java без головы, создайте в нем объект PGraphics (1) и выполните все свои операции рисования на этом.Затем сохраните объект PGraphics на диск в виде файла изображения, используя .save ().

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");
1 голос
/ 22 июня 2010

Xvfb, вероятно, будет быстрее, чем рендер Java, и X-сервер с аппаратным ускорением будет самым быстрым с большим отрывом, но если вы хотите «чистое» решение Java, вы можете попробовать Pure Java AWT Инструментарий .

РЕДАКТИРОВАТЬ: Вот пример загрузки командной строки из здесь :

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
0 голосов
/ 15 октября 2014

Решение от Ollie Glass перестало работать, потому что конструктор 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 вызывает его parent (PApplet) для некоторых вспомогательных методов.Тем не менее, это не было установлено, потому что мы не имеем права создавать * 1016. * во-первых.

Решение состоит в том, чтобы избавиться от этих вызовов функций, создав собственную версию 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() являются копиями кода из PGraphics с изменением не вызывать getFontMetrics(Font font) из несуществующего parent PApplet.Вместо этого оба перенаправляют на третий метод, который переопределяет отсутствующий вспомогательный метод PApplet как немного более короткую версию java.awt.Component.getFontMetrics(Font font).

Надеюсь, это поможет.

Было бы неплохо иметь нативныйбезголовая версия обработки при явном вызове файла как чертежной доски.

...