/** Matrix Adjust Dave Bollinger, Dec 2006 http://www.davebollinger.com for Processing 0123 Beta Drag sliders to adjust channel mixing RGB' = R * X + G * Y + B * Z */ PImage src, dst; int [] values; HScrollbar [] bars; int [][] tables; static int RX=0, RY=1, RZ=2, GX=3, GY=4, GZ=5, BX=6, BY=7, BZ=8; static String [] labels = { "Red X", "Red Y", "Red Z", "Green X", "Green Y", "Green Z", "Blue X", "Blue Y", "Blue Z" }; void setup() { size(200,200,P3D); src = loadImage("eames.jpg"); dst = src.get(); PFont font = loadFont("small-6.vlw"); bars = new HScrollbar[9]; values = new int[9]; for (int i=0; i<9; i++) { bars[i] = new HScrollbar(10+(i%3)*65, height-50+(i/3)*15, 50, 8, 5, labels[i], font); bars[i].setRange(0,255); values[i] = ((i/3)==(i%3)) ? 255 : 0; bars[i].setValue((float)(values[i])); } tables = new int[9][256]; } void draw() { boolean changed = false; for (int i=0; i<9; i++) { bars[i].update(); if (bars[i].getValue() != values[i]) { values[i] = bars[i].getValue(); changed = true; } } if (changed) { matrixAdjustImage(src,dst,values); } background(dst); for (int i=0; i<9; i++) bars[i].draw(); } int peg(int n) { return (n < 0) ? 0 : ((n > 255) ? 255 : n); } void matrixAdjustImage(PImage src, PImage dst, int [] values) { for (int j=0; j<9; j++) for (int i=0; i<256; i++) tables[j][i] = peg((i * values[j]) >> 8); int [] rxtable=tables[RX], rytable=tables[RY], rztable=tables[RZ]; int [] gxtable=tables[GX], gytable=tables[GY], gztable=tables[GZ]; int [] bxtable=tables[BX], bytable=tables[BY], bztable=tables[BZ]; int [] sp = src.pixels, dp = dst.pixels; for (int i=dp.length-1; i>=0; i--) { int c = sp[i]; int r = (c & 0xFF0000) >> 16; int g = (c & 0xFF00) >> 8; int b = c & 0xFF; dp[i] = (c & 0xFF000000) | (peg(rxtable[r] + rytable[g] + rztable[b])<<16) | (peg(gxtable[r] + gytable[g] + gztable[b])<<8) | (peg(bxtable[r] + bytable[g] + bztable[b])) ; } }