首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript画布drawImage getImageData

JavaScript画布drawImage getImageData
EN

Stack Overflow用户
提问于 2020-02-11 18:35:00
回答 1查看 1.2K关注 0票数 0

我无法理解两个方法如何使用画布: drawImage getImageData实际上,我希望将位图图像解析为一个RGBA点数组,能够转换它并使用putImageData方法显示它。但只有一件事管用: drawImage或getImageData。我请求帮助-解释这些方法是如何相互影响的。

代码语言:javascript
复制
<!DOCTYPE html>
    <html lang="en">
     <head>
      <meta charset="UTF-8">
      <title> Canvas to array </title>
     </head>
<body>
    <canvas id="canvas" width="1200" height="600" />
    <script>
      "use strict"
      let imageData;
      let My_img = new Image();
      My_img.src = 'test1.jpg';
      let cnv = document.getElementById("canvas");
      let ctx = cnv.getContext("2d");
      My_img.onload = function() {
          ctx.drawImage(My_img, 0, 0);
          imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
          for (let i=0; i<imageData.data.length; i+=4){
             imageData.data[i]=0;
             imageData.data[i+1]=255;
             imageData.data[i+2]=0;
             imageData.data[i+3]=222;
          }
         ctx.putImageData(imageData,300,300);
      };
    </script>
</body>
</html>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-11 18:59:55

您需要将图像对象上的跨源标志设置为“匿名”。

代码语言:javascript
复制
My_img.crossOrigin = "Anonymous";

另见:How to fix getImageData() error The canvas has been tainted by cross-origin data?

演示

代码语言:javascript
复制
let ctx = document.getElementById("canvas").getContext("2d");
let img = new Image();
img.crossOrigin = "Anonymous";
img.src = 'https://placekitten.com/200/138';
img.onload = function() {
  ctx.drawImage(img, 0, 0);
  setTimeout(() => filterImage(ctx), 1000);
};

// Multiply the value of the red channel by 2 and the blue channel by 3.
function filterImage(ctx) {
  let d = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
  for (let i = 0; i < d.data.length; i += 4) {
    d.data[i + 0] = Math.min(Math.floor(d.data[i + 0] * 2.0), 0xFF); // R
    d.data[i + 1] = Math.min(Math.floor(d.data[i + 1] * 1.0), 0xFF); // G
    d.data[i + 2] = Math.min(Math.floor(d.data[i + 2] * 3.0), 0xFF); // B
    d.data[i + 3] = 0xFF;                                            // A
  }
  ctx.putImageData(d, 0, 0);
}
代码语言:javascript
复制
<canvas id="canvas" width="200" height="138" />

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60175359

复制
相关文章

相似问题

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