【问题标题】:Canvas is not drawing images画布不绘制图像
【发布时间】:2016-07-08 21:16:13
【问题描述】:

我的画布有问题,我正在尝试绘制图像但无法正常工作,正如您所见,我正在将图像加载到数组中并等待在此之后加载所有图像我每次迭代都更改我的图像但不是画任何一个,请看我的代码。我找不到错误:(

(() => {
  "use strict";

  const images = [];
  const promises = [];
  const url = './assets/';
  const canvas = document.getElementById("canvas");
  const context = canvas.getContext("2d");
  const FPS = 30;
  const INTERVAL = 10000 / FPS;

  const canvasDraw = () => {
    let i = 0;

    setInterval(() => {
      context.drawImage(images[i] , 300, 300);
      i++;
      if (i === images.length) i = 0;
    }, INTERVAL);
  };

  const loadImage = (image) => {
    return new Promise((resolve) => {
      const img = new Image();

      img.src = url + image + '.png';
      img.onload = function () {
        images.push(img);
        resolve();
      };
    });
  };

  for(let i = 1; i < 14; i++) {
    promises.push(loadImage(i));
  }

  Promise
    .all(promises)
    .then(() => {
      canvasDraw();
    });
})();

我的 html 文件包含这样的画布

<canvas id="canvas"></canvas>

【问题讨论】:

    标签: javascript html image canvas draw


    【解决方案1】:

    你需要给你的画布一个宽度和高度。

    使用占位符图片:

    (() => {
      "use strict";
    
      const images = [];
      const promises = [];
      const url = './assets/';
      const canvas = document.getElementById("canvas");
      const context = canvas.getContext("2d");
      const FPS = 30;
      const INTERVAL = 10000 / FPS;
    
      const canvasDraw = () => {
        let i = 0;
    
        setInterval(() => {
          context.drawImage(images[i] , 0, 0);
          i++;
          if (i === images.length) i = 0;
        }, INTERVAL);
      };
    
      const loadImage = (image) => {
        return new Promise((resolve) => {
          const img = new Image();
    
          img.src = 'https://placehold.it/' + (image * 20) + 'x' + (image * 20);
          img.onload = function () {
            images.push(img);
            resolve();
          };
        });
      };
    
      for(let i = 1; i < 14; i++) {
        promises.push(loadImage(i));
      }
    
      Promise
        .all(promises)
        .then(() => {
          canvasDraw();
        });
    })();
    &lt;canvas id="canvas" width="300" height="300"&gt;&lt;/canvas&gt;

    根据您的操作,您可能希望在渲染之间清除画布。

    (() => {
      "use strict";
    
      const images = [];
      const promises = [];
      const url = './assets/';
      const canvas = document.getElementById("canvas");
      const context = canvas.getContext("2d");
      const FPS = 30;
      const INTERVAL = 10000 / FPS;
    
      const canvasDraw = () => {
        let i = 0;
    
        setInterval(() => {
          context.clearRect(0, 0, canvas.width, canvas.height); // Clear the canvas
          context.drawImage(images[i] , 0, 0);
          i++;
          if (i === images.length) i = 0;
        }, INTERVAL);
      };
    
      const loadImage = (image) => {
        return new Promise((resolve) => {
          const img = new Image();
    
          img.src = 'https://placehold.it/' + (image * 20) + 'x' + (image * 20);
          img.onload = function () {
            images.push(img);
            resolve();
          };
        });
      };
    
      for(let i = 1; i < 14; i++) {
        promises.push(loadImage(i));
      }
    
      Promise
        .all(promises)
        .then(() => {
          canvasDraw();
        });
    })();
    &lt;canvas id="canvas" width="300" height="300"&gt;&lt;/canvas&gt;

    【讨论】:

    • 谢谢,在我的情况下没有必要,因为图像具有相同的大小并且没有透明度:)
    • @axlpl 很酷,很高兴我能帮上忙 :)
    • 只是指出setInterval在用于渲染函数时是危险的,可能会导致不可预知的页面崩溃。使用requestAnimationFrame或setTimeout防止调用堆栈溢出错误或页面崩溃
    猜你喜欢
    • 1970-01-01
    • 2020-08-26
    • 2016-08-22
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2012-06-06
    • 2012-10-08
    相关资源
    最近更新 更多