代码之家  ›  专栏  ›  技术社区  ›  Maciek

将处理草图保存到PNG文件,服务器端,无GUI/显示

  •  7
  • Maciek  · 技术社区  · 16 年前

    没有GUI ). 处理草图是静态的(也就是说,没有动画),所以我只需要抓取第一帧,我想将这个结果按需提供给我们的web应用程序的用户。

    我在processing.org论坛上搜索了一下,有人建议,processing并不打算无头启动。我所见过的唯一一种黑客方法是推出无头X11显示器:

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

    .. 这对我们来说是行不通的,因为我们希望有一个纯Java的解决方案,并且不能总是保证在服务器端有一个X渲染器。

    3 回复  |  直到 16 年前
        1
  •  1
  •   Alexander Torstling    16 年前

    Xvfb可能比java渲染器更快,硬件加速的X服务器将是最快的,但如果您想要一个“纯”java解决方案,您可以尝试 Pure Java AWT Toolkit

    编辑:下面是一个从 here

    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
    
        2
  •  1
  •   Ollie Glass    15 年前

    创建一个标准的无头Java应用程序,在其中创建一个PGraphics对象(1),并在该应用程序上执行所有绘图操作。然后使用.save()将PGraphics对象作为图像文件保存到磁盘。

    代码的外观与此类似:

    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");
    
        3
  •  0
  •   Community Mohan Dere    9 年前

    解决方案来自 Ollie Glass PApplet/Applet 检查环境是否无头,即。 -Djava.awt.headless=true .

    相反,创建 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();
    

    称其为 parent (the) PApplet )对于某些助手方法。但是,由于不允许创建 丘疹

    一个解决方案是通过创建自己版本的 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() 代码的副本来自 印刷术 换成不打电话 getFontMetrics(Font font) 起源 丘疹 丘疹 作为一个略短的版本 java.awt.Component.getFontMetrics(Font font) .

    希望有帮助。

    当明确地调用一个文件作为绘图板时,最好有一个本地的无头处理版本。