GMU:Processing im Park/Part3: Difference between revisions

From Medien Wiki
No edit summary
(Clean up)
Line 1: Line 1:
== Image Sorting ==
=Sound and Video Processing =
 
=== Pixel Sorting ===
 
<source lang="java">
PImage img;
int id = 1;
int sortMode = 1;
 
void setup() {
  size(600, 400);
  reset();
}
 
void reset() {
    img = loadImage("winterpark.jpg");
}
 
void draw() {
 
  // load em
  img.loadPixels();
 
  color[] pxls = img.pixels;
 
  switch(sortMode) {
    case 1:
      sortLeft(pxls);
      break;
    case 2:
      sortDown(pxls);
      break;
    case 3:
      sortUp(pxls);
      break;
  }
 
 
  // update em
  img.updatePixels();
 
  // show em
  image(img, 0, 0);
 
 
}
 
 
void sortLeft(color[] pxls) {
 
  // do something with the pixels (remix them)
  for(int y = 0; y < height; y++) {
   
    for(int x = 0; x < width-1 ; x++) {
 
      // get indices for left and right pixel
      int left = y * img.width + x;
      int right = y * img.width + (x+1);
 
      // bubble sort step ( exchange pixels according to saturation ... )
      int posx = mouseX - width / 2;
   
      if(green(pxls[right]) - green(pxls[left]) < posx) {
          // exchange color values of those pixels
          color tmp= pxls[right];
          pxls[right] = pxls[left];
          pxls[left] = tmp;
      } 
    }
  }
 
}
 
void sortDown(color[] pxls) {
 
  // do something with the pixels (remix them)
  for(int x = 0; x < width; x++) {
   
    for(int y = height - 2; y > 0 ; y--) {
 
      // get indices for left and right pixel
      int top = y * img.width + x;
      int bottom = (y+1) * img.width + x;
     
      // bubble sort step ( exchange pixels according to saturation ... )
      int posx = mouseX - width / 2;
   
      if(green(pxls[top]) - green(pxls[bottom]) < posx) {
          // exchange color values of those pixels
          color tmp= pxls[top];
          pxls[top] = pxls[bottom];
          pxls[bottom] = tmp;
      } 
    }
  }
}
 
 
void sortUp(color[] pxls) {
 
  // do something with the pixels (remix them)
  for(int x = 0; x < width; x++) {
   
    for(int y = 0; y < height -1 ; y++) {
 
      // get indices for left and right pixel
      int top = y * img.width + x;
      int bottom = (y+1) * img.width + x;
     
      // bubble sort step ( exchange pixels according to saturation ... )
      int posx = mouseX - width / 2;
   
      if(green(pxls[top]) - green(pxls[bottom]) < posx) {
          // exchange color values of those pixels
          color tmp= pxls[top];
          pxls[top] = pxls[bottom];
          pxls[bottom] = tmp;
      } 
    }
  }
 
}
 
void keyPressed() {
  switch(key) {
    case ' ': 
      reset();
      break;
    case 's':
      save("sorted-" + id +".jpg");
      id++;
      break;
    case '1':
      sortMode = 1;
      break;
    case '2':
    sortMode = 2;
    break;
    case '3':
    sortMode = 3;
    break;
  }
}
</source>
 
----
 
=== Tile Sorting ===
 
<source lang="java">
 
PImage img;
int d = 10;
PImage[] tiles;
int rows, cols, n;
 
 
void setup() {
 
  size(600, 400);
  img = loadImage("fall.jpg");
 
  cols = (img.width/d);
  rows = (img.height/d);
 
  n = cols * rows;
  tiles = new PImage[n];
 
  for (int i = 0; i < n; i++) {
 
    int x = d * (i % cols);
    int y = d * (i / cols);
 
    tiles[i] = img.get(x, y, d, d);
   
  }
 
}
 
 
 
void draw() {
 
  sort(tiles);
  // show tiles
  for(int i = 0; i < n; i++) {
   
    PImage tile = tiles[i];
 
    int y = d * (i / cols);
    int x = d * (i % cols);
   
    image(tile, x, y, d, d);
   
  }
   
}
 
void sort(PImage[] tiles) {
 
  for(int y = 0; y < rows; y++) {
    for(int x = 0; x < cols-1; x++) {
     
      int pos1 = y * cols + x;
      int pos2 = y * cols + (x+1);
     
      PImage tile1 = tiles[pos1];
      PImage tile2 = tiles[pos2];
     
      if( saturation(average(tile1)) - saturation(average(tile2)) > mouseX ) {
        PImage tmptile = tiles[pos1];
        tiles[pos1] = tiles[pos2];   
        tiles[pos2] = tmptile;
      }
     
    }
  }
}
 
 
color average(PImage img) {
  img.loadPixels();
  color[] pxls = img.pixels;
 
  float r = 0, g = 0, b = 0;
  int n = pxls.length;
 
  for(int i = 0; i < n; i++) {
    color c = pxls[i];
    r += red(c);
    g += green(c);
    b += blue(c);
  }
  color average = color(r/n, g/n, b/n);
  return average;
}
</source>
 
----


== Video Delay ==
== Video Delay ==

Revision as of 12:39, 21 January 2016

Sound and Video Processing

Video Delay

import processing.video.*;

Capture camera;
int maxFrames;
int d = 4;
boolean recording = false;

ArrayList frames = new ArrayList();


void setup() {
  
  size(640, 480);
  
  maxFrames = width / d;
  
  // init camera
  camera = new Capture(this, width, height);
  
  camera.start(); // wichtig!
  
  // add first image
  PImage img = createImage(width, height, RGB);
  frames.add(img);

}


void draw() {
  
  int n = frames.size();
  
  // iterate over vertical strips
  for(int i = 0; i < n; i++) {
    
    // get snip from the frame
    PImage img = (PImage) frames.get(i);
    
    // x coordinate for the left side of the current strip
    int x1 = int(map(i, 0, n-1, 0, width/2 - 100));
    int y1 = int(map(i, 0, n-1, 0, height/2 - 100));
    
    int x2 = width - x1;
    int y2 = height - y1;
    
    int w = x2 - y1;
    int h = y2 - y1;
    
    PImage snip = img.get(x1, y1, w, h);
    
    // show strip on screen
    //tint(255, 50);
    image(snip, x1, y1);
    
  }
  
  if(recording) {
    
    saveFrame("frame-####.png");
    
    // recording feedback
    stroke(255, 0, 0);
    noFill();
    strokeWeight(5);
    rect(0, 0, width, height);

  }

}

void keyPressed() {
  recording = !recording;
}

void captureEvent(Capture camera) {
  
  camera.read(); // wichtig!
  PImage img = camera.get();
  
  frames.add(img);
  
  if( frames.size() > maxFrames) {
    frames.remove(0);
  } 
  
}