在Node.js中将管道缓冲区图像数据转换为Uint8ClampedArray格式

15

我希望您能帮助我将图片数据传输到一个函数中,这个函数在浏览器中使用非常成功。

在浏览器中的代码如下:

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

这很好,并且据我所知,它似乎从一个canvas中的图像生成了一个ImageData对象。

ImageData对象的.data属性似乎是一个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图像缓冲区获取带有正确格式的 [r1, g1, b1, a1, r2, g2, b2, a2.....]Uint8ClampedArray,以便我可以将其传递给我的函数?
Sharp 提供其他缓冲区编码方法,如 .png().jpeg(),但这两者都没有为我工作,我认为我当前正在使用的 .raw() 函数会给我想要的结果。
非常感谢您的帮助!
1个回答

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);
  });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接