JavaScript getImageData Canvas

标签 javascript image html5-canvas

// Set colour of light bulb
function set_bulb_colour(img_id, rgb_colour) {
  var img = new Image();

  img.onload = function() {
    var canvas = document.createElement('canvas');

    canvas.width = img.width;
    canvas.height = img.height;

    var ctx = canvas.getContext('2d');
    ctx.drawImage(img, 0, 0);

    var image_data = ctx.getImageData(0, 0, canvas.width, canvas.height);
    var data = image_data.data;

    for (var i = 0; i < data.length; i += 4) {
      if (data[i + 3] == 0) {
        continue;
      }

      // If the pixel is yellow set it to the new colour
      if (data[i] > 200 && data[i + 2] < 100) {
        data[i] = rgb_colour[0];
        data[i + 1] = rgb_colour[1];
        data[i + 2] = rgb_colour[2];
      }
    }

    ctx.putImageData(image_data, 0, 0);

    $('img#living_room_light_emoji').attr('src', canvas.toDataURL());
  }

  img.src = 'images/light_bulb.png';
}

如果有人知道答案,我对上面的代码有疑问。该代码有效。它将灯泡图像中的所有黄色像素更改为传入的 rgb 颜色。我从 getImageData 获得了一个对象。然后我得到调用 .data 的数据。我修改了 data 变量中的像素。但是当我使用 putImageData 重新绘制图像时,我将对象 image_data 放回原处,而不是我正在修改的“数据”。这是如何工作的,data 变量是否以某种方式指向 image_data 中的对象?

所以我要问的是,通过阅读该代码,您似乎通过调用 .data 获取了 image_datadata 的副本并将其存储在名为 data 的变量中。对我来说,修改 data 不会修改 image_data。但确实如此。这是如何运作的?当您使用 image_data 重绘时,它具有修改后的 datadata 是否指向 image_data?我知道如何在 C 中做到这一点,但没想到它会在 javascript 中这样工作

最佳答案

How does that work, does the ‘data’ variable somehow point to the object in ‘image_data’?

简短的回答是肯定的。

可以在这里找到更长的答案:Is JavaScript a pass-by-reference or pass-by-value language?

基本上,它是“共享调用”(与按值传递或按引用传递相反)。如果您更改“原始”,更改将不会保留下来,但对“引用”的更改将保留到原始。

关于JavaScript getImageData Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50340155/

相关文章:

javascript - ASP.net VB 详细信息查看插入 : javascript Postback on Cancel issue

javascript - 为什么 Javascript 只加载一次?

image - 什么是图像矢量?

jquery - 使用 jQuery 变形图像

javascript - AngularJs : json parsing

android - 将从相机拍摄的图像保存到内部存储器

java - 调整大小后的图像尺寸大于原始图像

html - Canvas contenteditable 不工作

javascript - Fabric.js 低 FPS 多个对象的不透明度动画

javascript - 如何使 Javascript 日期和 CSS3 动画协同工作?