Bilder (Bitmaps)

Bilder laden, in Variable speichern und darstellen. (Achtung: "Sketch/Add File..." oder von Hand nach Sketch-Folder/data!)

size(800,480);

PImage hintergrundbild;
PImage bild;
hintergrundbild = loadImage("back.gif");
bild = loadImage("luigi24.png");

background(hintergrundbild);
imageMode(CENTER);
image(bild,width/2,height/2);

Bilder (Vektoren)

Vektordaten (SVG, z.B. aus Illustrator) mit PShape statt PImage, ansonsten bleibt alles ähnlich (aber: Skalierbarkeit!).

size(600,600);

PShape svgbild;
svgbild = loadShape("fade.svg");

background(255);
shapeMode(CENTER);
shape(svgbild, width/2, height/2, 800, 800);
shape(svgbild, width/2, height/2, 400, 400);
shape(svgbild, width/2, height/2, 200, 200);
shape(svgbild, width/2, height/2);

Anders als bei Pixelbildern, lassen sich bei vektorbasierten Bildern die Processing-Styles (fill, stroke) benutzen. Z.B.

size(600,600);

PShape svgbild;
svgbild = loadShape("fade.svg");

svgbild.disableStyle();

background(255);
shapeMode(CENTER);
fill(0,0,64);
shape(svgbild, width/2, height/2, 800, 800);
fill(0,0,128);
shape(svgbild, width/2, height/2, 400, 400);
fill(0,0,192);
shape(svgbild, width/2, height/2, 200, 200);
fill(0,0,255);
shape(svgbild, width/2, height/2);

Oder in Abhängigket von Maus/Touch (Schaltfläche):

PShape svgbild;

void setup() {
  size(800,400);
  svgbild = loadShape("fade.svg");
}

void draw() {
  background(0);
  shapeMode(CENTER);

  shape(svgbild, width/2, height/2, 200, 200);
}

void mousePressed() {
  if (mouseX > width/2-100 && mouseX < width/2+100 &&
      mouseY > height/2-100 && mouseY < height/2+100) {
    svgbild.disableStyle();
  } else {
    svgbild.enableStyle();
  }
}

(Pixel-)Bild und Maus

Am einfachsten: Bild an Mausposition zeichnen.

PImage bild;

void setup() {
  size(800,480);
  bild = loadImage("backlarge.png");
}

void draw() {
  background(0);
  imageMode(CENTER);
  image(bild, mouseX, mouseY);
}

Echtes Drag&Drop braucht Koordinaten für das Bild:

PImage bild;
float bildX;
float bildY;
float startX;
float startY;

void setup() {
  size(800,480);
  bild = loadImage("backlarge.png");
  bildX = width/2;
  bildY = height/2;
  startX = bildX;
  startY = bildY;
}

void draw() {
  background(0);
  imageMode(CENTER);
  image(bild, bildX, bildY);
}

Wenn die Maus gedrückt wird: den Abstand zwischen Maus und Bildposition merken.

void mousePressed() {
  startX = mouseX;
  startY = mouseY;
}

Wenn die Maus dann gezogen wird, verändert das die Bildposition (abhängig vom ursprünglichen Abstand zwischen Maus und Bild).

void mouseDragged() {
  bildX = mouseX + startX;
  bildY = mouseY + startY;
}

Optional: Die Koordinaten sperren, wenn das Bild an die Ränder stößt (siehe: constrain()).

void mouseDragged() {
  bildX = constrain(mouseX+startX, width/2-(bild.width-width)/2, width/2+(bild.width-width)/2);
  bildY = constrain(mouseY+startY, height/2-(bild.height-height)/2, height/2+(bild.height-height)/2);
}

Diorama

Klasse für Layer (vorne, mitte, hinten) und verschieden große Bilder (für Parallax-Scrolling).

Steuerung mit der Tastatur (Java, siehe keyPressed()) und dem Touchscreen (Android, siehe mouseReleased()).

Quellcode: Android, Java

Bild als Ball

Ball mit Bild (Sprite): Bild darstellen statt zeichnen in display()

void display() {
  imageMode(CENTER);
  image(bild,x,y);
}

Und dazu: Bild laden und merken. Insgesamt:

class Ball {
  float x;
  float y;
  float vx;
  float vy;
  PImage bild;

  Ball() {
    x = width/2;
    y = height/2;
    vx = random(-1, 1);
    vy = random(-1, 1);
    bild = loadImage("name.png");
  }

  void display() {
    imageMode(CENTER);
    image(bild,x,y);
  }

  void update() {
    x = x+vx;
    y = y+vy;
    if (x<0) { 
      vx = -vx; 
      x = 0;
    }
    else if (x>width) {
      vx = -vx; 
      x = width;
    }
    
    if (y<0) { 
      vy = -vy; 
      y = 0;
    }
    else if (y>height) { 
      vy = -vy; 
      y = height;
    }
  }
}

Animation

Photoshop macht Layer zu Animationen (Make Frames from Layers)...

...und Animationen zu Bildsequenzen (Export/Render Video.../Bildsequenz).

Für jeden Frame ein Bild laden. Speichern und Darstellung übernimmt eine Klasse (Übersicht: Tabs!).

Animation a;
PImage bg;

void setup() {
  size(800,480);
  a = new Animation("luigi",35);
  bg = loadImage("back.gif");
}  

void draw() {
  imageMode(CENTER);
  image(bg,width/2,heigth/2);
  a.display();
}
Dazu eine Klasse (zur Übersicht: im neuen Tab!) für Animationen (im Prinzip eine Kombination aus Mover/Ball und ArrayList für mehrere Bilder). Beachte, dass in der update()-Funktion nichts passiert (kein Verhalten/keine Interaktion).
class Animation {
  ArrayList<PImage> images;
  int currentImage;
  float x;
  float y;
  Animation(String name, int imageCount) {
    images = new ArrayList();
    for (int i=1; i<=imageCount; i++) {
      images.add(loadImage(name+nf(i, 2)+".png"));
    }
    x = width/2;
    y = height/2;
  }
  void display() {
    imageMode(CENTER);
    image(images.get(currentImage), x, y);
    currentImage++;
    if (currentImage==images.size()) currentImage = 0;
  }
  void update() {
    // hier passiert nichts
  }
}

dazu: Animation-data.zip

Interaktion und Animation

Die update()-Funktion der Animation bekommt Verhalten (wieder wie Mover/Ball): sie reagiert auf die Maus (siehe auch: Abstand messen mit dist()).

class InteractiveAnimation {
  ArrayList<PImage> images;
  int currentImage;
  float x;
  float y;
  InteractiveAnimation(String name, int imageCount) {
    images = new ArrayList();
    for (int i=1; i<=imageCount; i++) {
      images.add(loadImage(name+nf(i, 2)+".png"));
    }
    x = width/2;
    y = height/2;
  }
  void display() {
    imageMode(CENTER);
    image(images.get(currentImage), x, y);
    currentImage++;
    if (currentImage==images.size()) currentImage = 0;
  }
  void update() {
    if (dist(mouseX, mouseY, x, y) < 50) {
      x = x + random(-2, 2);
      y = y + random(-2, 2);
    }
  }
}

Beim Erzeugen der Animation (new...) den Namen der Dateien angeben - bis hin zur Zahl (also "luigi" für "luigi01.png" bis "luigi35.png"). Dahinter dann die Anzahl (hier: 35). Das Laden aller Bilder erfolgt dann automatisch (dank for-Schleife).

InteractiveAnimation ia;
PImage bg;

void setup() {
  size(800,480);
  ia = new InteractiveAnimation("luigi",35);
  bg = loadImage("back.gif");
}  

void draw() {
  imageMode(CENTER);
  image(bg,width/2,height/2);
  ia.update();
  ia.display();
}

Moorhuhn-Mario

Diorama plus Klassen für ein Mario/Luigi-Moorhuhn und für eine Menge davon (inkl. Erzeugen/Löschen).

Quellcode: Android, Java