【问题标题】:Convert raw image to buffer将原始图像转换为缓冲区
【发布时间】:2017-05-16 13:21:37
【问题描述】:

显然没有简单的方法可以在 Raspberry Pi 中流式传输图像。虽然有许多 hacks 可用,但在我的 Raspberry Pi Zero 中,它在保持良好的帧率方面存在一些问题。

我怀疑主要问题之一是1st Google solution 和其中大多数为每个图像写入/读取到 SD。到目前为止,我已经在不接触 SD 的情况下从终端读取图像:

const out = await exec(`fswebcam -r 640x480 -`);
const img = out[0];
console.log(img);

这在终端上给了我这个:

 ����JFIF``��>CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), default quality
��      

 $.' ",#(7),01444'9=82<.342��C          

还有更多。以前我用缓冲区做类似的事情:

const file = fs.readFileSync(temp);
console.log(file.toString('base64'));
ctx.socket.emit('frame', { image: true, buffer: file.toString('base64') });

其中file 是一个缓冲区,file.toString('base64') 是一个字符串,格式如下:

/9j/4AAQSkZJRgABAQEAYABgAAD//gA8Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2ODApLCBxdWFsaXR5ID0gMTAwCv ...

这有效(但通过 SD 卡)。所以我的问题是,终端中第一个输出的格式是什么?以及如何将其转换为类似于后者的 Buffer 或 String。

【问题讨论】:

  • 看起来像 jpeg - JFIF 代表 Jpeg 文件交换格式,通常称为 JPEG。
  • @barny 抱歉,是 jpg。但我的意思是,它是二进制的吗?如何将保存的数据转换为可用的格式,例如Buffer
  • 是的,它是二进制的。可以用 toString() 吗?
  • 是的,但这就是我在执行 .toString() 时得到的结果:console.log(img.toString()) 使 ����JFIF``��&gt;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), default quality�� [...]
  • 抱歉意思是 toString('base64') - 这将产生 ASCII 表示的数据,这不是您对进出 SD 的数据所做的吗?或者如果不是,那么我真的不明白你的实际问题是什么。

标签: node.js image file raspberry-pi buffer


【解决方案1】:

我最终只是通过管道使用终端将其转换为 base64:

fswebcam -r 640x480 - | base64

所以现在我的整个 sn-p 是:

// Take a picture in an async way and return it as a base64 encoded string
// Props: https://scottlinux.com/2012/09/01/encode-or-decode-base64-from-the-command-line/
module.exports = async ({ resolution = '640x480', rotate = 0 } = {}) => {
  const query = `fswebcam -r ${resolution} --rotate ${rotate} - | base64`;
  const out = await exec(query, { maxBuffer: 1024 * 1024 });
  return out[0];
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多