getImageData(x0,y0,x1,y1)
を使います。
例えば、
var image = ctx.getImageData(0,0,w,h);
とした場合、image にはピクセル単位の集合体がオブジェクトとなったもの(イメージデータ)が返ってきます。
このオブジェクトは、「data」というプロパティを持っていて、ここでピクセルデータを保持しています。
「data」プロパティの配列には、各ピクセルのRGBAデータが
{R, G, B, A, R, G, B, A, ...}
の順番で格納されています。(R = Red, G = Greed, B = Blue, A = Alpha)
これがピクセル分だけ続きます。つまり配列の要素数は ピクセル数 x 4 になります。
例えば、Alpha を徐々に変化させる場合はこんな感じ
var canvas = document.getElementById('canvas');
if ( ! canvas || ! canvas.getContext ) { return false; }
ctx = canvas.getContext("2d");
var w = canvas.width;
var h = canvas.height;
ctx.fillStyle = 'rgb(224, 224, 240)';
ctx.fillRect(0,0,w,h);
var step = 265 / (h * 1.5);
var image = ctx.getImageData(0,0,w,h);
for(var i=3; i<image.data.length ; i+=4) {
var alpha = 255 - ((i/4/h) * step);
if(alpha < 0) alpha = 0;
image.data[i] = alpha;
}
ctx.clearRect(0,0,w,h);
ctx.putImageData(image,0,0);
モノクロ(monochrome)はこんな感じ
var canvas = document.getElementById('canvas');
if ( ! canvas || ! canvas.getContext ) { return false; }
ctx = canvas.getContext("2d");
var w = canvas.width;
var h = canvas.height;
ctx.drawImage(canvas, 0, 0);
var image = ctx.getImageData(0,0,w,h);
var i = image.data.length;
for(var y = h; y>0; y--){
for(var x = w; x>0; x--){
i -= 4;
var c = 0.298912 * image.data[i] + 0.586611 * image.data[i+1] + 0.114478 * image.data[i+2];
image.data[i] = image.data[i+1] = image.data[i+2] = parseInt(c);
}
}
ctx.clearRect(0,0,w,h);
ctx.putImageData(image,0,0);
0 件のコメント:
コメントを投稿