我正在尝试将图像数据传输到我已在浏览器中成功使用的函数中。
浏览器中的代码如下:
var myImageData = context.getImageData(0, 0, width, height);
var gray = tracking.Image.grayscale(myImageData.data, width, height);
这工作得很好,据我所知似乎正在生成一个 ImageData
canvas
中图像中的对象.
.data
ImageData
的属性(property)对象似乎是 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 的模式,这表明有问题。
我的问题是:
我怎样才能得到 Uint8ClampedArray
使用适当的 [r1, g1, b1, a1, r2, g2, b2, a2.....]
从 Node.js 中的图像缓冲区格式化,然后我可以将其传递给我的函数?
Sharp 提供其他缓冲区编码方法,如 .png()
或 .jpeg()
但这些都不适合我,我认为 .raw()
我目前正在使用的功能会给我想要的东西。
非常感谢任何帮助!
最佳答案
输入缺少 alpha channel 。我认为最简单的事情就是像这样加入一个新 channel :
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);
});
关于javascript - 将缓冲区图像数据管道化为 Node.js 中的 Uint8ClampedArray 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39087314/