将帧保存到文件而不在处理中渲染

Saving frame to file without rendering in processing

在 Processing 中,如何修改将每一帧保存到图像文件的现有草图,使其不渲染到屏幕?

我在https://forum.processing.org/one/topic/how-can-i-save-calculate-frame-without-displaying-them-in-real-time.html中看到可以使用PGraphics将图形绘制到离线缓冲区中,这似乎是我所追求的,但我不确定如何轻松实现修改我现有的草图,以这种方式使用 PGraphics class。

除此之外,如果需要,我还希望通过设置切换变量来呈现到屏幕的选项。

有没有一种简单的方法可以“改造”现有的草图,以便它可以使用 PGraphics 而不是默认的渲染方法(比如,在 setup 方法中)所以我不必须进入我的草图并更改每个绘图命令?

您可以使用 PGraphics 对象并在其上绘图,就像使用 canvas 一样。这是一个没有绘制循环的示例草图,它输出一个图像文件:

void setup() {
  PGraphics pg = createGraphics(150, 150);
  
  pg.beginDraw();
  pg.background(255);
  pg.stroke(0);
  pg.fill(color(0, 0, 200));
  pg.rect(50, 50, 50, 50);
  pg.endDraw();
  
  pg.save("fileName.png");
}

在我的草图文件夹中,它创建了这个文件:

关于另一个问题:我不认为你可以在不大量修改代码的情况下将书面绘制循环改装成类似的输出而不在草图 window 中渲染它,但是......如果你目标是您能够在草图 window 或文件之间进行选择,您可以在 PGraphics 中绘制每一帧,并根据您的业务规则选择是否要显示 PGraphics。你仍然有很多重构要做,但这是不可避免的。

这是与之前相同的示例,但实现了这个想法:

boolean showFrame = true;
boolean saveFrame = false;

void setup() {
  size(150, 150);
}

void draw() {
  PGraphics pg = createGraphics(150, 150);
  
  pg.beginDraw();
  pg.background(255);
  pg.stroke(0);
  pg.fill(color(0, 0, 200));
  pg.rect(50, 50, 50, 50);
  pg.endDraw();
  
  if (showFrame) {image(pg, 0, 0);}
  if (saveFrame) {pg.save("fileName.png");}
}

希望这对您有所帮助。玩得开心!