在Processing中,如何将部分窗口保存为图像?

时间:2015-01-08 12:14:49

标签: image save restore

我在Fedora 20下使用Processing,我想显示在屏幕的一部分上移动的对象的延伸轨迹的图像,每个对象显示在轨道末端的当前位置。为了避免必须记录轨道的所有坐标,我使用save("image.png");来保存到目前为止的轨道,然后绘制对象。在下一帧中,我使用img = loadImage("image.png");来恢复到目前为止所做的轨道,没有仍然处于其先前位置的对象。我将轨道扩展到新的位置,然后使用save("image.png");来保存扩展轨道,仍然没有对象,为下一轮循环做好准备。然后我在他们扩展轨道末端的新位置画出物体。以这种方式,连续的循环显示物体前进,其先前的位置作为它们后面的轨道。

这在图像是整个帧的测试中运行良好,但现在我需要将该显示放在整个帧的一角,并保持其余不变。我希望createImage(...)将成为答案,但我找不到任何有关如何实现的细节。

此处提出的类似问题有以下建议:" PImage类包含一个导出到文件的save()函数。对于像这样的问题,API应该是您的第一站。"我当然看过那个API,但我不认为这有帮助,除非我必须创建图像以逐像素保存,在这种情况下我希望它会慢事情很多。

所以我的问题是:在Processing中,我可以将帧的一部分保存并恢复为图像,而不会影响帧的其余部分吗?

2 个答案:

答案 0 :(得分:0)

我继续研究这个。我觉得很奇怪,我可以找到保存和加载整个框架的草图参考,教程和示例,但没有简单的方法来保存和恢复框架的一部分作为图像。我可以使用Pimage来做这件事,但这似乎需要在那里绘制的所有内容中都有大量的image.

我已经用了一个kludge:我创建了一个掩模图像(参见this Processing reference)整个帧的大小。掩模定义为表示不透明度的灰色区域,因此白色,零不透明度(0)是透明的,黑色,完全不透明(255)完全隐藏背景图像,因此:

{ size (1280,800);
  background(0); // whole frame is transparent..
  fill(255); // ..and..
  rect(680,0,600,600); // ..smaller image area is now opaque
  save("[path to sketch]/mask01.jpg");
}

void draw(){}

然后在我的主要代码中使用:

PImage img, mimg;

img = loadImage("image4.png"); // The image I want to see ..
// .. including the rest of the frame which would obscure previous work
mimg = loadImage("mask01.jpg"); // create the mask
//apply the mask, allowing previous work to show though
img.mask(mimg); 
// display the masked image
image(img, 0, 0); 

如果没有更好的建议,我会接受这个答案。

答案 1 :(得分:0)

void setup(){
  size(640, 480);
  background(0);

  noStroke();
  fill(255);
  rect(40, 150, 200, 100);
}

void draw(){

}

void mousePressed(){
  PImage img  =get(40, 150, 200, 100);
  img.save("test.jpg");
}