イメージからアプレットを起動
マスクを利用した描画のサンプル。の再現。
実は、マスクと言っても今回は見せかけです。background()と同色の切り抜き画像を用意し、フレーム毎に描画されたものに画像を貼付けて、抜けているように見せているだけです。
最初は、コード内でマスクとなる画像を生成し、その画像をPImageのmask()を使ってマスクを実現しようとしましたが、それは断念しました。
理由は、コードでマスクとなる画像も生成しようとしたが、円形の画像保存ができず、すべて四角形になってしまう。(その方法がわからなかった。)
次に外部ファイルとして円形の画像を用意しmask()を使った方法を試みたが、 フレーム毎の処理がとても重く現実的でないので断念。mask()の処理は「同じサイズの二つの画像を用意し、マスクとする画像でもう片方の画像を切り抜く」といったもののようだが、今回の場合はline()で描画した画面を一度save()で画像出力し、その画像を読み込んでマスクされる画像とするという手順を試みたため、この手順がよくない原因だと思いました。
ということで最終的に、見せたくない部分を白く塗りつぶすという「見せかけマスク」の方法をとりました。
用意したマスク用外部ファイルはこちら。(といっても真っ白なのが表示されるだけですね。万が一使うようだったら右クリックなどで「リンク先を別名で保存」などでダウンロードしてください。)
[java]
int leftBounds = 20;
int topBounds = 20;
int x = leftBounds;
int y = topBounds;
int rightBounds = 380;
int bottomBounds = 380;
int baseMax = 20;
int randomMax = 10;
int maxLines = 200;
int counter = 0;
PImage myImage, myMask;
void setup(){
size(400, 400);
background(255);
smooth();
myMask = loadImage(“mask.png”);
}
void draw(){
if(counter < maxLines){
int maxDistance = baseMax * int(random(0, 1) * randomMax);
int minDistance = 2;
int direction = random(0, 1) < 0.5 ? -1 : 1;
int xEnd = x + (direction * (minDistance + int( random(0, 1) * maxDistance)) );
direction = random(0, 1) < 0.5 ? -1 : 1;
int yEnd = y + (direction * (minDistance + int( random(0, 1) * maxDistance)) );
if(xEnd < leftBounds) xEnd = leftBounds;
if(xEnd > rightBounds) xEnd = rightBounds;
if(yEnd < topBounds) yEnd = topBounds;
if(yEnd > bottomBounds) yEnd = bottomBounds;
stroke(#006699, 20);
strokeWeight(maxDistance/20);
line(x, y, xEnd, yEnd);
x = xEnd;
y = yEnd;
image(myMask, 0, 0);
counter++;
}
// if(counter == maxLines){
// save(“img.png”);
// background(255);
// myImage = loadImage(“img.png”);
// myImage.mask(myMask);
// image(myImage, 0, 0);
// noLoop();
// }
}
void keyPressed(){
if(key == ‘r’){
background(255);
counter = 0;
}
if(key ==’q'){
save(“p41_Lines08.jpg”);
exit();
}
}
[/java]
タグ: processing
