<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      button {
        padding: 10px 50px;
        cursor: pointer;
      }
      .custom {
        width: 200px;
        height: 200px;
      }
      .canvas-container {
        border: 5px solid #000;
        margin-bottom: 10px;
        margin-top: 10px;
      }
    </style>
    <script>
      const draw = () => {
        const availableImages = [1, 2];
        let canvas = document.querySelector("#screenShotCanvas");
        var context = canvas.getContext("2d");
        let image = document.querySelector("#cnimg");
        canvas.width = availableImages.length * 700;
        canvas.height = 450;
        var promises = availableImages.map((img, index) => {
          var imageEl = document.getElementById(`img${index + 1}`);
          imageEl.setAttribute("crossOrigin", "anonymous");
          imageEl.height = 450;
          imageEl.width = 700;
          context.drawImage(imageEl, index * 700, 0, 700, 450);
          return img;
        });

        Promise.all(promises)
          .then(() => {
            var canvasImg = canvas.toDataURL();
            console.log("????canvasImg????");
            console.log(canvasImg);
            image.src = canvasImg;
          })
          .catch((error) => {
            console.log("⚠️ERROR⚠️");
            console.error(error.message);
          });
      };
    </script>
  </head>
  <body>
    <button onclick="draw()">DRAW</button>
    <div class="canvas-container">
      <h2>Canvas image will show here once you click DRAW button</h2>
      <canvas id="screenShotCanvas"></canvas>
    </div>
    <div>
      <img
        class="custom"
        src="https://cdn.pixabay.com/photo/2016/02/05/19/51/stained-glass-1181864_960_720.jpg"
        id="img1"
      />
      <img
        class="custom"
        src="https://cdn.pixabay.com/photo/2018/10/08/13/05/hindu-3732713_960_720.jpg"
        id="img2"
      />
    </div>
    <div>
      <h2>Base 64 converted image will show here.</h2>
      <img src="" id="cnimg" alt="base64" />
    </div>
  </body>
</html>

In the above code snippet, there are two static images from pixabay.com.
When you press DRAW button, it will generate a canvas which is the combination of those two images.

创建画布后,我将其转换为base64格式以在<img src="" id="cnimg" alt="base64" />中显示.

But the problem is :我需要按两次DRAW按钮才能得到画布和base64格式的图像.

如果我删除imageEl.setAttribute("crossOrigin", "anonymous");,那么我会得到画布,但我不会得到base64格式的图像,也会得到一个错误.

未能对"HTMLCanvaElement"执行"toDataURL":可能无法导出受污染的画布.

推荐答案

您可以在html上添加crossOrigin,它会起作用,下面是一个示例:

const draw = () => {
  const availableImages = [1, 2];
  let canvas = document.querySelector("#screenShotCanvas");
  var context = canvas.getContext("2d");
  canvas.width = availableImages.length * 100;

  var promises = availableImages.map((img, index) => {
    var imageEl = document.getElementById(`img${index + 1}`);
    context.drawImage(imageEl, index * 100, 0, 100, 100);
  });

  Promise.all(promises)
    .then(() => {
      document.querySelector("#cnimg").src = canvas.toDataURL()
    })
};
div>img {
  width: 50px
}
<button onclick="draw()">DRAW</button>
<div class="canvas-container">
  <canvas id="screenShotCanvas" height=100></canvas>
</div>
<div>
  <img id="img1" crossOrigin="anonymous" src="https://cdn.pixabay.com/photo/2016/02/05/19/51/stained-glass-1181864_960_720.jpg" />
  <img id="img2" crossOrigin="anonymous" src="https://cdn.pixabay.com/photo/2018/10/08/13/05/hindu-3732713_960_720.jpg" />
</div>
<img id="cnimg" alt="base64"  src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" />

我有根据地猜测,您最初的问题是,更改脚本中的交叉原点会影响图像,可能会导致重新加载,而当我们try 绘制图像时,图像尚未重新加载,这就是为什么它会再次工作.

One improvement I added to your code was:
<img src="" id="cnimg" alt="base64" />
that will display I changed your src to a transparent 1x1 pixel image, to not show anything

我确实减少了很多代码,以便只关注问题,您应该在问题上也这样做,最少的代码更有可能获得更快的响应

Javascript相关问答推荐

在类型脚本中使用浏览器特定属性的正确方法是什么?

验证嵌套 colored颜色 代码的结果

序列查找器功能应用默认值而不是读取响应

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

在React中获取数据后,如何避免不必要的组件闪现1秒?

调用removeEvents不起作用

我不知道为什么setwritten包装promise 不能像我预期的那样工作

无法在nextjs应用程序中通过id从mongoDB删除'

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

在这种情况下,如何 for each 元素添加id?

加载背景图像时同步旋转不显示的问题

更改预请求脚本中重用的JSON主体变量- Postman

在Matter.js中添加从点A到另一个约束的约束

在不删除代码的情况下禁用Java弹出功能WordPress

如何在Java脚本中对列表中的特定元素进行排序?

Next.js中的服务器端组件列表筛选

Node.js错误: node 不可单击或不是元素

react 路由DOM有条件地呈现元素

用Reaction-RT-Chart创建实时条形图

将Singleton实例设置为未定义后的Angular 变量引用持久性行为