我正在尝试构建漂亮的图形图像(动画!),计算屏幕上每个像素的颜色,然后一次显示所有像素。因此,我在循环上使用了putImageData函数。
但是由于某种原因,它不起作用。在屏幕上(1-2秒后)只能看到最后一次迭代。
我尝试在每次迭代后使用FillRect,但这没有帮助。
<html>
<head>
<title>Full Screen Canvas Test</title>
<style>
html, body {
overflow: hidden;
margin: 0;
}
</style>
</head>
<body>
<canvas id="mainCanvas"></canvas>
<script>
(function () {
canvas = document.getElementById('mainCanvas');
ctx = canvas.getContext("2d");
canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
step = 1;
function doit() {
rx = Math.floor(Math.random()*canvas.width);
ry = Math.floor(Math.random()*canvas.height);
gx = Math.floor(Math.random()*canvas.width);
gy = Math.floor(Math.random()*canvas.height);
bx = Math.floor(Math.random()*canvas.width);
by = Math.floor(Math.random()*canvas.height);
var canvasData = ctx.createImageData(canvas.width, canvas.height);
for (var i = 0; i < canvas.width; i+=step) {
for (var j = 0; j < canvas.height; j+=step) {
po = 2;
rd = Math.floor(Math.sqrt(Math.pow(rx - i, po)+Math.pow(ry - j, po)));
gd = Math.floor(Math.sqrt(Math.pow(gx - i, po)+Math.pow(gy - j, po)));
bd = Math.floor(Math.sqrt(Math.pow(bx - i, po)+Math.pow(by - j, po)));
maxd = 1400;
r = Math.floor((1 - rd/maxd)*255);
g = Math.floor((1 - gd/maxd)*255);
b = Math.floor((1 - bd/maxd)*255);
var index = (i + j * canvas.width) * 4;
canvasData.data[index + 0] = r;
canvasData.data[index + 1] = g;
canvasData.data[index + 2] = b;
canvasData.data[index + 3] = 255;
}
}
ctx.putImageData(canvasData, 0, 0);
}
doit();
doit();
doit();
doit();
doit();
doit();
doit();
doit();
})();
</script>
</body>
答案 0 :(得分:0)
您需要使用setInveral()
多次调用doit()
函数,每次调用之间都有时间延迟。当前方法的问题在于,它正在一次迭代中运行所有doit()
结果,然后仅在覆盖前一个结果时才显示最后一个。因此,您需要依次显示每个结果。
请参见下面的工作示例:
<html>
<head>
<title>Full Screen Canvas Test</title>
<style>
html,
body {
overflow: hidden;
margin: 0;
}
</style>
</head>
<body>
<canvas id="mainCanvas"></canvas>
<script>
(function() {
canvas = document.getElementById('mainCanvas');
ctx = canvas.getContext("2d");
canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
step = 1;
function doit() {
rx = Math.floor(Math.random() * canvas.width);
ry = Math.floor(Math.random() * canvas.height);
gx = Math.floor(Math.random() * canvas.width);
gy = Math.floor(Math.random() * canvas.height);
bx = Math.floor(Math.random() * canvas.width);
by = Math.floor(Math.random() * canvas.height);
var canvasData = ctx.createImageData(canvas.width, canvas.height);
for (var i = 0; i < canvas.width; i += step) {
for (var j = 0; j < canvas.height; j += step) {
po = 2;
rd = Math.floor(Math.sqrt(Math.pow(rx - i, po) + Math.pow(ry - j, po)));
gd = Math.floor(Math.sqrt(Math.pow(gx - i, po) + Math.pow(gy - j, po)));
bd = Math.floor(Math.sqrt(Math.pow(bx - i, po) + Math.pow(by - j, po)));
maxd = 1400;
r = Math.floor((1 - rd / maxd) * 255);
g = Math.floor((1 - gd / maxd) * 255);
b = Math.floor((1 - bd / maxd) * 255);
var index = (i + j * canvas.width) * 4;
canvasData.data[index + 0] = r;
canvasData.data[index + 1] = g;
canvasData.data[index + 2] = b;
canvasData.data[index + 3] = 255;
}
}
ctx.putImageData(canvasData, 0, 0);
}
// Use setInterval to display the images sequentially (every 1000 m/s (every second))
let showImg = setInterval(doit, 1000);
})();
</script>
</body>