javascript - 将多个屏幕外 Canvas 绘制到屏幕 Canvas 上

标签 javascript canvas

当我尝试将多个屏幕外 Canvas 渲染到屏幕 Canvas 中时遇到问题。我确实渲染了一个离屏 Canvas ,但问题是之前应该渲染过另外两个 Canvas 。换句话说,仅渲染最后一个 Canvas 。预期的结果将是三个重叠的红色、绿色和蓝色矩形(或正方形:)。代码如下:

function rectangle(color) {
    var offScreenCanvas = document.createElement('canvas');
    var offScreenCtx = offScreenCanvas.getContext('2d');

    var width = offScreenCanvas.width = 150;
    var height = offScreenCanvas.height = 150;

    switch(color) {
        case 1: 
            offScreenCtx.fillStyle='rgb(255,0,0)';
            break;
        case 2:
            offScreenCtx.fillStyle='rgb(0,255,0)';
            break;
        case 3:
            offScreenCtx.fillStyle='rgb(0,0,255)';
            break;
    }

    offScreenCtx.fillRect(0,0,width,height);

return offScreenCanvas;
}

function draw(offScreenCanvas, x , y) {
    var canvas = document.getElementById('canvas')
    var ctx = canvas.getContext('2d');

    var width = canvas.width = window.innerWidth;
    var height = canvas.height = window.innerHeight;

    ctx.drawImage(offScreenCanvas, x, y);
}

var images = [];
var color = 1;

for (var i=0; i<3; i++) {
    var img = new rectangle(color);
    images.push(img);
    color++;
}

var x = 0;
var y = 0;

for (var i = 0; i < images.length; i++) {
    draw(images[i], x, y);
    x += 100;
    y += 100;
}

我做了一些搜索,似乎我不是第一个遇到这个问题的人,但我无法让它正常工作。

最佳答案

设置 Canvas 高度宽度会清除 Canvas 。

代码的问题是,当您在函数 draw 中设置屏幕 Canvas 大小时,会导致屏幕 Canvas 被清除

设置 Canvas 大小,即使大小相同,也会导致 Canvas 上下文重置并清除 Canvas 。所有其他 Canvas 都会渲染,但在您设置屏幕 Canvas 大小时会被删除。

您的绘图函数

function draw(offScreenCanvas, x , y) {
    var canvas = document.getElementById('canvas')
    var ctx = canvas.getContext('2d');

    // The cause of the problem ===================================
    // Either one of the following lines will clear the canvas
    var width = canvas.width = window.innerWidth;
    var height = canvas.height = window.innerHeight;
    //=============================================================

    ctx.drawImage(offScreenCanvas, x, y);
}

要避免这种情况,只需设置一次 Canvas 大小即可。如果您需要调整 Canvas 大小并保留其内容,您首先需要创建 Canvas 的副本,然后调整其大小,然后将副本渲染回原始状态。

演示展示了将 5 个离屏 Canvas 渲染到一个屏幕 Canvas 上。

const colours = ['#f00', '#ff0', '#0f0', '#0ff', '#00f'];
const ctx = can.getContext('2d');
can.width = innerWidth - 4;  // sub 4 px for border
can.height = innerHeight - 4;

function createCanvas(color, i) {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  canvas.width = 150;
  canvas.height = 150;
  ctx.font = "24px arial";
  ctx.fillStyle = color;
  ctx.fillRect(0, i * 30, canvas.width, 30);
  ctx.fillStyle = "black";
  ctx.fillText("Canvas "+i,10,(i + 0.75) * 30);
  return canvas;
}
colours.forEach((c, i) => {
  ctx.drawImage(createCanvas(c, i), 0, 0);
})
canvas {
  border: 2px solid black;
  position : absolute;
  top : 0px;
  left : 0px;
}
<canvas id="can"></canvas>

关于javascript - 将多个屏幕外 Canvas 绘制到屏幕 Canvas 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44608344/

相关文章:

javascript - 提交表单而不重定向

javascript - 仅在 iframe 中导航

Android绘制动画线

Android:如何在不同的屏幕尺寸上使用 Canvas 方法处理绘图?

javascript - 如何将我的代码重构为游戏循环?

javascript - 如何定义异步函数?

javascript - Highcharts + Bootstrap .table 响应问题

javascript - 使用 Angular.js 将值分配给模型名称时出现错误

canvas - Three.js 中的纹理形状拉伸(stretch)

javascript - 圆圈应该互相碰撞,但不起作用