将缓冲区图像数据管道传输到Node.js中的Uint8ClampedArray格式

aba*_*haw 10 javascript image image-processing node.js

我正在尝试将图像数据传输到我在浏览器中成功使用的函数中.

浏览器中的代码如下:

var myImageData = context.getImageData(0, 0, width, height);
var gray = tracking.Image.grayscale(myImageData.data, width, height);
Run Code Online (Sandbox Code Playgroud)

这工作得很好,从我的理解似乎是ImageData从图像生成一个对象canvas.

所述.data的的属性ImageData对象似乎是一个Uint8ClampedArray读取[r1, g1, b1, a1, r2, g2, b2, a2.....]的图案看,每第四个数字是255其有意义的,因为没有一个图像是透明的.

我试图以类似的方式在Node.js中使用它,除了我从https://github.com/lovell/sharp生成的缓冲区中获取我的图像数据:

sharp(body)
    .resize(newWidth, newHeight)
    .raw()
    .toBuffer(function (err, buffer, info) {
        var gray = tracking.Image.grayscale(buffer, newWidth, newHeight);
    });
Run Code Online (Sandbox Code Playgroud)

问题是,这显然不起作用.

我无法将缓冲区直接传递给函数.我已经尝试了很多东西,实际上向我展示了一个数组的唯一过程是buffer.toJSON().data.看那个,数字都<= 255,但是我看不到每个第四个数字都是255模式,这表明出现了问题.


我的问题是:

如何从Node.js中的图像缓冲区获取Uint8ClampedArray正确的[r1, g1, b1, a1, r2, g2, b2, a2.....]格式,然后我可以传递给我的函数?


Sharp提供了其他缓冲区编码方法.png(),.jpeg()但是这些方法都没有对我.raw()有用,我认为我目前使用的功能会给我我想要的东西.

任何帮助深表感谢!

m1c*_*4ls 0

输入缺少 Alpha 通道。我认为最简单的事情就是加入一个新频道,如下所示:

sharp(body)
  .resize(newWidth, newHeight)
  .joinChannel(Buffer.alloc(newWidth * newHeight, 255), {
    raw: {
      width: newWidth,
      height: newHeight,
      channels: 1
    }
  })
  .raw()
  .toBuffer(function (err, buffer, info) {
    var gray = tracking.Image.grayscale(buffer, newWidth, newHeight);
  });
Run Code Online (Sandbox Code Playgroud)