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

时间:2016-08-22 19:28:25

标签: javascript node.js image image-processing

我试图将图片数据传输到我在浏览器中成功使用的功能。

浏览器中的代码如下:

var myImageData = context.getImageData(0, 0, width, height);
var gray = tracking.Image.grayscale(myImageData.data, width, height);

这很好用,据我所知,似乎是从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);
    });

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

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

我的问题是:

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

Sharp提供了其他缓冲区编码方法,如.png().jpeg(),但这些方法都没有对我有用,我认为我目前使用的.raw()函数会给我什么我想要。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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);
  });