我试图将图片数据传输到我在浏览器中成功使用的功能。
浏览器中的代码如下:
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()
函数会给我什么我想要。
非常感谢任何帮助!
答案 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);
});