import processing.video.*;
// Schnittstelle zur Kamera
Capture cam;
// Speicher für die Einzelbilder aus
// der 'Vergangenheit'
PImage[] buffer;
// Anzahl der Einzelbilder pro
// Sekunde für Sketch und Aufnahme
int fps = 21;
// Zeitverzögerung in Sekunden
int lagSeconds = 2;
// Abspielposition und damit Schlüssel
// für das Einfügen/Auslesen aus dem Buffer
int index = 0;
// Status ob der Bildspeicher schon
// einmalig komplett gefüllt wurde
boolean filled = false;
// Anzahl der Spalten im Sketchfenster
int cols = 6;
void setup () {
size (318, 278);
frameRate (fps);
cam = new Capture (this, 320, 240, 20);
buffer = new PImage[lagSeconds * fps];
}
void draw () {
// Bildgröße für Raster ermitteln
float imgWidth = width / cols;
float aspect = imgWidth / cam.width;
float imgHeight = cam.height * aspect;
// Für jedes Feld im 'Bildspeicher'
for (int i=0; i < buffer.length; i++) {
// Wenn ein Bild existiert
if (buffer[i] != null) {
// Berechne die Position im Raster
float x = (i % cols) * imgWidth;
float y = floor (i / cols) * imgHeight;
image (buffer[i], x, y, imgWidth, imgHeight);
}
}
}
void captureEvent (Capture theCam) {
// Lies das aktuelle Kamerabild aus
theCam.read ();
// Speicher eine Kopie im Buffer an
// der Position des Bildes welches
// gerade ausgelesen wurde
buffer[index] = theCam.get ();
// Erhöhe die Position für das Auslesen
// um eins, auf das älteste Bild im Buffer
index++;
// Wenn am Ende des Buffers angekommen,
// springe wieder an den Anfang.
if (index >= buffer.length) {
index = 0;
if (!filled) {
filled = true;
}
}
}