使用putImageData从画布上的像素数组中绘制图像

Eli*_*sen 9 javascript arrays canvas pixel putimagedata

我正在开发一个可以加密图像并在画布上重绘解密图像的项目.由于我还不熟悉编码和编程,我目前正在重新绘制解密图像数据的问题,这是一个R,G,B,A形式的像素阵列.我认为只需将数据放入即可

ctx.putImageData(imgd,0,0);
Run Code Online (Sandbox Code Playgroud)

但是firebug告诉我,该值没有实现imagedata的接口.我在这里发布了整个阵列.图像宽160像素,高120像素.

有没有办法重新格式化数组,以便它可以在画布上绘制?

小智 11

使用Uint8你可以更快:

var canvas = document.createElement("canvas"),
    ctx = canvas.getContext("2d"),
    img = [27,32,26,28, ... ];

// Get a pointer to the current location in the image.
var palette = ctx.getImageData(0,0,160,120); //x,y,w,h
// Wrap your array as a Uint8ClampedArray
palette.data.set(new Uint8ClampedArray(img)); // assuming values 0..255, RGBA, pre-mult.
// Repost the data.
ctx.putImageData(palette,0,0);
Run Code Online (Sandbox Code Playgroud)

除非您需要先修改值,否则无需逐字节进行操作.

  • “调色板”.. 嗯,这听起来像别的东西。我可能会称变量为“imageData”或更有用的东西。 (3认同)
  • `var 调色板 = new ImageData(new Uint8ClampedArray(img), 160, 120)`? (2认同)

Bar*_*art 10

假设imgd只是一个包含所有字节值的数组,您仍然需要将数组转换为ImageData.

var imgd = [27,32,26,28,33,27,30,35,29,31.....]

// first, create a new ImageData to contain our pixels
var imgData = ctx.createImageData(160, 120); // width x height
var data = imgData.data;

// copy img byte-per-byte into our ImageData
for (var i = 0, len = 160 * 120 * 4; i < len; i++) {
    data[i] = imgd[i];
}

// now we can draw our imagedata onto the canvas
ctx.putImageData(imgData, 0, 0);
Run Code Online (Sandbox Code Playgroud)

  • `var imgData = new ImageData(new Uint8ClampedArray(imgd),160,120)`? (3认同)