Javascript 使用putImageData()和UInt8ClampedArray从HTML5画布中的3D阵列渲染1个像素

Javascript 使用putImageData()和UInt8ClampedArray从HTML5画布中的3D阵列渲染1个像素,javascript,html5-canvas,array-push,putimagedata,uint8array,Javascript,Html5 Canvas,Array Push,Putimagedata,Uint8array,我尽了最大努力在HTML5画布上渲染一个3D数组中的1个像素,但没有成功 (我知道这之前已经做过,但不是用3D阵列)。但将3D阵列转换为Uint8ClampedArray并推送到Uint8ClampedArray并不容易 HTML5也没有另一种显示像素可操作图像的方法 putImageData()用于渲染垂直像素字符串是否正确 这是我的代码,问题标记为:“我在这里要做什么”: 您已经创建了一个普通的Javascript数组-您只需要将其转换为一个钳制数组。在我的脑海里,就像: document.

我尽了最大努力在HTML5画布上渲染一个3D数组中的1个像素,但没有成功

(我知道这之前已经做过,但不是用3D阵列)。但将3D阵列转换为Uint8ClampedArray并推送到Uint8ClampedArray并不容易

HTML5也没有另一种显示像素可操作图像的方法

putImageData()用于渲染垂直像素字符串是否正确

这是我的代码,问题标记为:“我在这里要做什么”:


您已经创建了一个普通的Javascript数组-您只需要将其转换为一个钳制数组。在我的脑海里,就像:

document.getElementById("canvas").getContext("2d").putImageData(new 
  ImageData(Uint8ClampedArray.from(x), 1, 1), 1, 1);

(或者将数据写入新的Uint8ClampedArray)

您已经创建了一个普通的Javascript数组-您只需要将其转换为一个钳制数组。在我的脑海里,就像:

document.getElementById("canvas").getContext("2d").putImageData(new 
  ImageData(Uint8ClampedArray.from(x), 1, 1), 1, 1);

(或者将数据写入新的Uint8ClampedArray)

将200 x 200红色块绘制到画布中。需要

我建议不要使用3D阵列,因为它看起来不必要的复杂

const width = 200;
const height = 200;

const canvas = document.getElementsByTagName('canvas')[0];
const context = canvas.getContext('2d');
canvas.width = width;
canvas.height = height;
const destData = new ImageData(width, height);
const dData = destData.data;

for (let y = 0; y < height; y++) {
  for (let x = 0; x < width; x++) {
    const o = 4 * (y * width + x);
    dData[o] = 255; // R
    dData[o + 1] = 0; // G
    dData[o + 2] = 0; // B
    dData[o + 3] = 255; // A
  }
}

context.putImageData(destData, 0, 0);
const width=200;
常数高度=200;
const canvas=document.getElementsByTagName('canvas')[0];
const context=canvas.getContext('2d');
画布宽度=宽度;
canvas.height=高度;
const destData=新的图像数据(宽度、高度);
const dData=destData.data;
对于(设y=0;y
将200 x 200红色方块绘制到画布中。需要

我建议不要使用3D阵列,因为它看起来不必要的复杂

const width = 200;
const height = 200;

const canvas = document.getElementsByTagName('canvas')[0];
const context = canvas.getContext('2d');
canvas.width = width;
canvas.height = height;
const destData = new ImageData(width, height);
const dData = destData.data;

for (let y = 0; y < height; y++) {
  for (let x = 0; x < width; x++) {
    const o = 4 * (y * width + x);
    dData[o] = 255; // R
    dData[o + 1] = 0; // G
    dData[o + 2] = 0; // B
    dData[o + 3] = 255; // A
  }
}

context.putImageData(destData, 0, 0);
const width=200;
常数高度=200;
const canvas=document.getElementsByTagName('canvas')[0];
const context=canvas.getContext('2d');
画布宽度=宽度;
canvas.height=高度;
const destData=新的图像数据(宽度、高度);
const dData=destData.data;
对于(设y=0;y
我有了解决方案,而且很有效,我想发布文章,为堆栈溢出社区做出贡献,因此下一个有这个问题的人可以自己轻松地在那里完成

正如上面所述,这是一个简化版本:

<!DOCTYPE html>
<html lang="en" + dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>
      Google Chrome, I suppose
    </title>
  </head>
  <body style="background-color: black; margin: 0px; margin-bottom: 0px; padding: 0px;">
    <canvas style="image-rendering: pixelated" id="canvas">
    </canvas>
    <script>
      var t =
      [
        240,
        128
      ];
      document.getElementById('canvas').width = t[0];
      document.getElementById('canvas').height = t[1];
      var a = new Array()
      {
        a.push([]);
        a[a.length - 1].push([]);
        a[a.length - 1][a[a.length - 1].length - 1].push(127, 127, 127, 255);
      }
      var i = 0;
      document.getElementById('canvas').getContext('2d').putImageData(new ImageData(Uint8ClampedArray.from
      (
        [].concat.apply
        ([],
          a[i]
        )
      ), 1), i, 0);
      i = i + 1;
      i = 0;
    </script>
  </body>
</html>

我想是谷歌浏览器吧
变量t=
[
240,
128
];
document.getElementById('canvas')。宽度=t[0];
document.getElementById('canvas')。高度=t[1];
var a=新数组()
{
a、 推送([]);
a[a.length-1]。推送([]);
a[a.length-1][a[a.length-1].length-1].push(127127127255);
}
var i=0;
document.getElementById('canvas').getContext('2d').putImageData(新的ImageData(uint8clampedaray.from
(
[]concat.apply
([],
a[i]
)
)i,0);
i=i+1;
i=0;
如您所见,我用a替换了变量x


我希望这也能帮助其他人,谢谢大家的建议

我有了解决方案,而且它是有效的,我想发布一篇文章,为堆栈溢出社区做出贡献,这样下一篇有这个问题的文章就可以自己轻松地在那里完成了

正如上面所述,这是一个简化版本:

<!DOCTYPE html>
<html lang="en" + dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>
      Google Chrome, I suppose
    </title>
  </head>
  <body style="background-color: black; margin: 0px; margin-bottom: 0px; padding: 0px;">
    <canvas style="image-rendering: pixelated" id="canvas">
    </canvas>
    <script>
      var t =
      [
        240,
        128
      ];
      document.getElementById('canvas').width = t[0];
      document.getElementById('canvas').height = t[1];
      var a = new Array()
      {
        a.push([]);
        a[a.length - 1].push([]);
        a[a.length - 1][a[a.length - 1].length - 1].push(127, 127, 127, 255);
      }
      var i = 0;
      document.getElementById('canvas').getContext('2d').putImageData(new ImageData(Uint8ClampedArray.from
      (
        [].concat.apply
        ([],
          a[i]
        )
      ), 1), i, 0);
      i = i + 1;
      i = 0;
    </script>
  </body>
</html>

我想是谷歌浏览器吧
变量t=
[
240,
128
];
document.getElementById('canvas')。宽度=t[0];
document.getElementById('canvas')。高度=t[1];
var a=新数组()
{
a、 推送([]);
a[a.length-1]。推送([]);
a[a.length-1][a[a.length-1].length-1].push(127127127255);
}
var i=0;
document.getElementById('canvas').getContext('2d').putImageData(新的ImageData(uint8clampedaray.from
(
[]concat.apply
([],
a[i]
)
)i,0);
i=i+1;
i=0;
如您所见,我用a替换了变量x


我希望这也能帮助其他人,谢谢大家的建议

谢谢你的回答!我马上去看看!哦,不,它又出现了这个错误:未捕获的DomeException:构造“ImageData”失败:输入数据长度不等于(4*width*height),我将尝试查看一下。非常感谢!你真的帮了我的忙!当我这样做时,它似乎可以工作:ImageData(Uint8ClampedArray.from([x[0][0][0],x[0][0][1],x[0][0][2],x[0][0][3],]),1,1),1;这是因为我为RGBA值创建了一个seperate维度。感谢您的回答!我马上去看看!哦,不,它又出现了这个错误:未捕获的DomeException:构造“ImageData”失败:输入数据长度不等于(4*width*height),我将尝试查看一下。非常感谢!你真的帮了我的忙!当我这样做时,它似乎可以工作:ImageData(Uint8ClampedArray.from([x[0][0][0],x[0][0][1],x[0][0][2],x[0][0][3],]),1,1),1;这是因为我为RGBA值创建了一个seperate维度。我已经用while(x.length