参照:canvas基本(1)
これを工夫すれば、アニメーションが作れるが、
あまりにも時間がかかるので、ごく小さな画面に限ります。
function rei1() {
// CANVAS の設定
var canvas = document.getElementById('canvas1');
var ctx = canvas.getContext('2d');
ctx.clearRect(0,0, 200,200);
// 背景(格子)の表示
for (var i=0; i<=200; i=i+20) {
ctx.beginPath();
ctx.moveTo(i, 0);
ctx.lineTo(i, 200);
ctx.closePath();
ctx.stroke();
}
for (var i=0; i<=200; i=i+20) {
ctx.beginPath();
ctx.moveTo(0, i);
ctx.lineTo(200, i);
ctx.closePath();
ctx.stroke();
}
// ここまでの画像をピクセルimageDataに保存する
var imageData = ctx.getImageData(0,0, 200,200);
// 赤直線(消される図形)を表示する
ctx.beginPath();
ctx.moveTo(20, 20);
ctx.lineTo(180, 100);
ctx.closePath();
ctx.strokeStyle = "red";
ctx.lineWidth = 10;
ctx.stroke();
// ピクセルで保存した画像を復元する(赤線が消える)
ctx.putImageData(imageData, 0, 0);
// 青直線(新図形)を表示する
ctx.beginPath();
ctx.moveTo(40, 160);
ctx.lineTo(160, 40);
ctx.closePath();
ctx.strokeStyle = "blue";
ctx.lineWidth = 10;
ctx.stroke();
}
function rei2() {
// CANVAS の設定
var canvas = document.getElementById('canvas2');
var ctx = canvas.getContext('2d');
// 元図形の表示
ctx.fillStyle = "blue";
ctx.fillRect(0,0,200,200);
ctx.fillStyle = "red";
ctx.fillRect(0,0,100,100);
// 色変更の領域をimageData に取得
var imageData = ctx.getImageData(50,50, 100,100);
// 色変更のためのワーク用配列
var data = imageData.data;
// 色の変更 色の強さ逆転(補色)
for (var i = 0; i < data.length; i += 4) {
data[i] = 255 - data[i]; // red
data[i + 1] = 255 - data[i + 1]; // green
data[i + 2] = 255 - data[i + 2]; // blue
}
// 色変更の領域を表示
ctx.putImageData(imageData, 50, 50); // imageDataにすること
}
function rei3(ptn) {
// CANVAS の設定
var canvas = document.getElementById('canvas3');
var ctx = canvas.getContext('2d');
ctx.clearRect(0,0, 200,200);
// 原画の読込み
var img = new Image();
img.src = 'image/200x200.jpg';
// 読み込んだ後の処理
img.onload = function() {
ctx.drawImage(img, 0, 0);
// 原画をピクセルデータ imageData に保存
var imageData = ctx.getImageData(0,0, 200,200);
// 各ピクセルの色の変更
var data = imageData.data;
if (ptn == "nega") { // ネガ
for (var i = 0; i < data.length; i += 4) {
data[i] = 255 - data[i]; // red
data[i + 1] = 255 - data[i + 1]; // green
data[i + 2] = 255 - data[i + 2]; // blue
}
}
else if (ptn == "gray") { // グレースケール
for (var i = 0; i < data.length; i += 4) {
var avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
data[i] = avg; // red
data[i + 1] = avg; // green
data[i + 2] = avg; // blue
}
}
else if (ptn == "sepia") { // セピア
for (var i = 0; i < data.length; i += 4) {
var red = data[i], green = data[i + 1], blue = data[i + 2];
data[i] = Math.min(Math.round(0.393 * red + 0.769 * green + 0.189 * blue), 255);
data[i + 1] = Math.min(Math.round(0.349 * red + 0.686 * green + 0.168 * blue), 255);
data[i + 2] = Math.min(Math.round(0.272 * red + 0.534 * green + 0.131 * blue), 255);
}
}
// ネガ画像の表示
ctx.putImageData(imageData, 0, 0);
}
}