月曜日, 2月 11, 2008

glitch (alike) for vjs 2

画像と合わせるのは簡単。

PImage型の変数を宣言(imgは合わせる画像、capはノイズをキャプチャした画像のために使う)

PImage img, cap;

して、setup()の中で画像を読み込む。background()にPImageのインスタンスを入れる場合は画像とウィンドウのサイズを合わせなければならないことに注意。

void setup() {
size(200, 200);
img = loadImage("mkk.jpg");
noiser = new Noiser(colNumber, rowNumber);
}


draw()はこんな感じ。

void draw() {
noiser.drawNoise();
cap = get();
background(img);
blend(cap, 0, 0, width, height, 0, 0, width, height, ADD);
}


noiser.drawNoise()でノイズを作った後、capに代入。
背景をimgで塗りつぶして、blend()使ってcapと合成。

blend()のシンタックス
blend(srcImg, x, y, width, height, dx, dy, dwidth, dheight, MODE)
x, y, width, heightは読み込む画像のx座標、y座標、幅、高さ
dx, dy, dwidth, dheightは書き出し先のx座標、y座標、幅、高さ
MODEはADDの他にも色々あるけどビットシフトはない。イラストレーターとかフォトショップのエフェクトと同じようなもの。試してみると面白い。

ということで、今後この辺は使いそうな気がする。
勿論pixels使って1ピクセル単位で操作することもできるし、ビットシフトはblend()じゃできないからいずれ使うことになるけど、とりあえず簡単な方法から。

金曜日, 2月 08, 2008

glitch (alike) for vjs

vade » Blog Archive » Real World Max/MSP/Jitter 1 - Glitch (alike) for VJs

glitchっぽい映像を、jitterで作るチュートリアル。
glitchの特徴はfragmentation, repetition, linearity and complexityだそう。
随分前にブックマークしておいたんだけど、今になってprocessingでやってみようと思った。

まずイメージと、ブロックノイズを組み合わせてるんだけど、ブロックノイズの作り方。
2通り思いつく。

普通にrect()で作る。

Noiser noiser;
int colNumber = 5;
int rowNumber = 5;

void setup() {
size(200, 200);
noiser = new Noiser(colNumber, rowNumber);
}

void draw() {
noiser.drawNoise();
}

class Noiser {
int col;
int row;
public Noiser(int col, int row) {
this.col = col;
this.row = row;
}
void drawNoise() {
for(int j=0; j<height; j+=height/row) {
for(int i=0;i<width;i+=width/col) {
noStroke();
fill(random(255),random(255),random(255));
rect(i, j, width/col, height/row);
}
}
}
}


pixels使う。widthをcolで割った数が整数にならなかったりした時とかに今後の展開感じる。

Noiser noiser;
color[][] colorTable;
int colIndex = 0;
int rowIndex = 0;
int colNumber = 5;
int rowNumber = 5;

void setup() {
size(200, 200);
noiser = new Noiser(colNumber, rowNumber);
colorTable = new color[colNumber][rowNumber];
}

void draw() {
noiser.drawNoise();
}

class Noiser {
int col;
int row;
public Noiser(int col, int row) {
this.col = col;
this.row = row;
}

void drawNoise() {
for(int j=0; j<height; j+=height/row) {
for(int i=0; i<width; i+=width/col) {
if(colIndex>=col) {
colIndex = 0;
}
if(rowIndex>=row) {
rowIndex = 0;
}
colorTable[colIndex][rowIndex] = color(random(255), random(255), random(255));
colIndex++;
}
rowIndex++;
}

loadPixels();
for(int j=0; j<height; j++) {
for(int i=0; i int pos = i+j*width;
if(pos%(width/col)==0) {
colIndex++;
}
if(pos%(width*height/row)==0){
rowIndex++;
}
if(colIndex>=col) {
colIndex = 0;
}
if(rowIndex>=row) {
rowIndex = 0;
}
pixels[pos] = colorTable[colIndex][rowIndex];
}
}
updatePixels();
}
}


次回、画像と合わせる。

金曜日, 2月 01, 2008

MAX_FLOAT, MIN_FLOAT

visualizing data読み始めて、知った。
最小値とか最大値を比べて取得する場合、初期値を代入する時に

float dataMax = MIN_FLOAT;
float dataMin = MAX_FLOAT;

としておく。
読んで字のごとくMIN_FLOATはfloatで一番小さい値で、MAX_FLOATはfloatで一番大きい値。
どんな数値もこれより小さくて大きい。

sonicodeでは文字をビットマップにして黒いところに順番に番号つけて、縦のセルで大きさを比べて最大値と最小値を出してるんだけど、最大値を入れるための変数の初期値を0にしてた。これだと負の値がきたときに動かない。
設計上負の値がくることはないからいいや、と思ってたけど、気持ち悪かったんだよね。
MIN_INT, MAX_INTもある。

0126から追加されたみたい。