Image Sorting
Pixel Sorting
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;
}
}
Tile Sorting
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;
}
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);
}
}