javascript - 将缓冲区图像数据管道化为 Node.js 中的 Uint8ClampedArray 格式

标签 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 的属性(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/

相关文章:

ios - 图像选择器显示多个图像,如拼贴画,没有内存问题

javascript - 尝试编辑 "React Native init"文件结构

node.js - 使用 NodeJS 和请求模块以及 aws-sdk 将图像从 Parse 移动到 S3/CloudFront

javascript - 在 ui-router 中,使用不同参数链接到相同状态不会执行任何操作

node.js - 如何知道子进程是否完成?

node.js - React 连接到 API,无需生产环境中的端点

php - 图像文件路径未插入数据库

java - Swing - 在 JAR 文件中包含图像

javascript - 如何根据屏幕尺寸更改 Angular JS 中的弹出框位置?

javascript - 无法使用 Hubot 将消息发送到 Slack 中的特定 channel - SlackRTMError : no channel id