首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getImageData/putImageData未绘制预期输出

getImageData/putImageData未绘制预期输出
EN

Stack Overflow用户
提问于 2021-11-27 16:05:08
回答 1查看 46关注 0票数 0

我有一个变量,它通过getImageData()保存画布的前一个状态,但是当我绘制它,然后尝试用putImageData()恢复到旧状态时,它就不工作了:

代码语言:javascript
复制
window.onload = async () => {
  const canvas = document.getElementById('canvas');
  const ctx = canvas.getContext('2d');
  let map;

  const drawPicture = async (image) => {
    const img = new Image();

    img.src = `assets/${image}.png`;
    img.onload = () => {
      ctx.drawImage(img, 0, 0, 60, 60);
    }
  }

  await drawPicture('log');
  map = ctx.getImageData(0, 0, 60, 60);
  await drawPicture('box');
  await ctx.putImageData(map, 0, 0);
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-28 11:25:38

罪魁祸首是drawPicture函数中的drawPicture处理程序。仅仅使用async前缀将函数标记为异步是不够的。在您的示例中,函数应该等到图像加载之后再将其绘制到画布上。

当前编写的onload处理程序将在上次函数调用之后触发:

代码语言:javascript
复制
await ctx.putImageData(map, 0, 0);

因此,正确的方法是让函数返回一个Promise,这在onload处理程序触发时就实现了。

代码语言:javascript
复制
window.onload = async () => {
    const canvas = document.getElementById('canvas');
    const ctx = canvas.getContext('2d');
    let map;

    const drawPicture = async (image) => {
        return new Promise(resolve => {
            const img = new Image();
            img.onload = () => {
                ctx.drawImage(img, 0, 0, 60, 60);
                resolve();
            }
            img.src = `assets/${image}.png`;
        });
    }

    await drawPicture('a');
    map = ctx.getImageData(0, 0, 60, 60);
    await drawPicture('b');
    await ctx.putImageData(map, 0, 0);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70136466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档