人工言語入門 A 2010
Processingで画像データを扱う
※こちらの内容は既に古い情報となっています。新しく書き直した記事を参照してください。
画像を表示する
- Processingで画像を表示するためには、画像ファイルをそのスケッチのある階層に「data」フォルダを作成し、その中に画像ファイルを入れる
- Jepg、GIF、PNG形式に対応している
- 画像を表示するには、image() 関数を用いる
- image(画像ファイル名, x, y); – 座標(x, y)を左上にして、画像を表示
- image(画像ファイル名, x, y, width, height); – 座標(x, y)を左上にして、幅(width)と高さ(height)を指定して画像を表示
画像を表示
PImage img;
void setup() {
size(640, 426);
img = loadImage("photo.jpg");
}
void draw() {
image(img, 0, 0);
}
位置とサイズを指定して画像を表示
PImage img;
void setup() {
size(640, 426);
img = loadImage("photo.jpg");
}
void draw() {
background(0);
image(img, width/4, height/4, width/2, height/2);
}
画像の色や透明度を変更する
- image() で表示した画像の、色や透明度を操作することができる
- tint() 関数
- tint(gray) – グレースケール画像のレベルを変更
- tint(gray, alpha) – グレースケール画像のレベルと透明度を変更
- tint(red, green, blue) – カラー画像のRGBの値を変更
- tint(red, green, blue, alpha) – カラー画像のRGBの値と透明度を変更
画像の色を変更してみる
イメージのレベルを変更
PImage img;
void setup() {
size(640, 426);
img = loadImage("photo.jpg");
}
void draw() {
background(0);
noTint();
image(img, 0, 0);
tint(102);
image(img, width/2, 0);
}
イメージのカラーを変更
PImage img;
void setup() {
size(640, 426);
img = loadImage("photo.jpg");
}
void draw() {
background(0);
noTint();
image(img, 0, 0);
tint(31, 127, 255);
image(img, width/2, 0);
}
イメージの透明度(アルファ)を変更
PImage img;
void setup() {
size(640, 426);
img = loadImage("photo.jpg");
}
void draw() {
background(0);
for(int i = 0; i < 8; i++) {
int xpos = i * width / 8;
fill(0);
rect(xpos, 0, width, height);
tint(255,255,255, i * 32);
image(img, xpos, 0);
}
}
ピクセルの情報を取得
- 表示した画像の情報をピクセル単位取得することができる
- 取得した画像の情報をもとに、より高度なイメージの操作、イメージの情報をもとにした表現を行うことが可能となる
- ピクセル情報の取得には、get() 関数を用いる
- get関数
- get() – ウィンドウ内のピクセル全てを取得、イメージを返す
- get(x, y) – 指定した座標、(x, y)のピクセルを取得、色の値を返す
- get(x, y, width, hegiht) – 指定した座標、(x, y) から幅(width)、高さ(height)を指定してイメージを取得
get()を使用した例
マウスの位置のピクセルの色を取得 – 取得したRGBの値で左上に3つの正方形を描く
PImage img;
void setup() {
size(640, 426);
stroke(255, 102);
img = loadImage("photo.jpg");
}
void draw() {
background(0);
image(img, 0, 0);
noStroke();
fill(0);
rect(20, 20, 60, 20);
color c = get(mouseX, mouseY);
fill(red(c), 0, 0);
rect(20, 20, 20, 20);
fill(0, green(c), 0);
rect(40, 20, 20, 20);
fill(0, 0, blue(c));
rect(60, 20, 20, 20);
stroke(255, 102);
line(mouseX, 0, mouseX, height);
line(0, mouseY, width, mouseY);
}
画像をモザイク化する
- loadPixels() – 現在画面に表示されているピクセル情報を記録する
- loadPixels() で格納したピクセルの色情報は、pixels[] 配列に格納される
- pixels[] 配列を一定間隔で読みだすことで、画像をモザイク化する
PImage img;
int mosaicWidth = 30;
int mosaicHeight = 20;
void setup() {
size(640, 426);
noStroke();
img = loadImage("photo.jpg");
}
void draw() {
background(0);
image(img, 0, 0);
loadPixels();
for(int j = 0; j < height; j+=mosaicHeight) {
for(int i = 0; i < width; i+=mosaicWidth) {
color c = pixels[j * width + i];
fill(c);
rect(i, j, mosaicWidth, mosaicHeight);
}
}
}
void mouseDragged() {
mosaicWidth = mouseX / 4 + 10;
mosaicHeight = mouseY / 4 + 10;
}
画像ファイルをスキャンする
- loadPixels() を活用して、画像の特定のy座標の色だけをとりだして、バーコード状に並べる
PImage img;
void setup() {
size(640, 426);
stroke(255, 102);
img = loadImage("photo.jpg");
image(img, 0, 0);
loadPixels();
}
void draw() {
for(int i = 0; i < width; i++) {
color c = pixels[width * mouseY + i];
stroke(c);
line(i, 0, i, height);
}
stroke(255, 102);
line(0, mouseY, width, mouseY);
}
フラクタルフォトモザイク
- モザイクのひとつひとつが同じ写真になっている
- モザイク状に配置した写真の明度をtintで変化させている
PImage img;
int mosaicWidth = 30;
int mosaicHeight = 20;
void setup() {
size(640, 426);
noStroke();
background(0);
img = loadImage("photo.jpg");
image(img, 0, 0);
loadPixels();
}
void draw() {
for(int j = 0; j < height; j+=mosaicHeight) {
for(int i = 0; i < width; i+=mosaicWidth) {
color c = pixels[j * width + i];
tint(red(c), green(c), blue(c));
image(img, i, j, mosaicWidth, mosaicHeight);
}
}
}
画像をピクセレイト
- 画像のピクセルの色情報をもとに、画像を再描画する – ピクセレイト
円の大きさと色で、画像を再構成する
PImage img;
int mosaicSize = 12;
void setup() {
size(640, 426);
noStroke();
img = loadImage("photo.jpg");
image(img, 0, 0);
loadPixels();
}
void draw() {
background(0);
for(int j = 0; j < height; j+=mosaicSize) {
for(int i = 0; i < width; i+=mosaicSize) {
color c = pixels[j * width + i];
fill(c, 127);
ellipse(i, j, brightness(c)/6.0, brightness(c)/6.0);
}
}
}
四角形の大きさと角度で、画像を再構成する
PImage img;
int mosaicSize = 6;
void setup() {
size(640, 426);
noStroke();
img = loadImage("photo.jpg");
image(img, 0, 0);
loadPixels();
rectMode(CENTER);
smooth();
}
void draw() {
background(0);
for(int j = 0; j < height; j+=mosaicSize) {
for(int i = 0; i < width; i+=mosaicSize) {
color c = pixels[j * width + i];
fill(c, 127);
pushMatrix();
translate(i, j);
rotate(brightness(c));
rect(0, 0, brightness(c)/6.0, 2);
popMatrix();
}
}
}
画像ファイルのデータを利用した表現
- Jared Tarbell, box.fitting.imageの紹介
- ソースファイルを解析してみる
- 画像ファイルを入れかえてみる
サンプルファイルのダウンロード
今日とりあげた全てのサンプルは下記からダウンロードしてください。