【问题标题】:Convert Float32Array to Buffer将 Float32Array 转换为缓冲区
【发布时间】:2020-04-26 09:26:33
【问题描述】:

我正在尝试返回一个二进制浮点数组。 我从 geotiff 库中得到一个 Float32Array,但是 http 只能 返回一个字符串或缓冲区,因此我必须将其“转换”为缓冲区。

const tiff  = await geotiff.fromUrl(ahnUrl);
const image = await tiff.getImage();
const data  = await image.readRasters(); <-- Is Float32Array
res.writeHead(200, {'Content-Type': 'application/octet-stream'});
var buf = Buffer.allocUnsafe( data.width * data.height );
for ( var y = 0; y < data.height; y++ )
{
  for ( var x = 0; x < data.width; x++ )
  {
    buf.writeFloatLE(data[y*data.width+x]);
  }
}
// buf = Buffer.from(data); <-- does not work
// buf = Buffer.from(data.buffer); neither
res.end(buf);

问题是双重for循环,我不想要这个。 理想情况下,没有额外的数据副本,绝对不是这个 非常慢的双 for 循环。速度非常关键。

我是 javascript/nodejs 的新手,但 Float32Array 似乎是多维的 它的长度返回 1,但它的宽度和高度是 1024x1024(如预期的那样)。

'const buf = Buffer.from(data)' 的结果是一个单字节长度的缓冲区。

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    谢谢,这确实有帮助。 但是,执行 Buffer.from(Float32Array) 会导致每个浮点缓冲区 1 个字节加上它复制数据。 为了让它工作,你还必须使用这个包:

    let toBuffer = require("typedarray-to-buffer")
    function()
    {
      const data  = await image.readRasters({interleave:true});
      const buf   = toBuffer(data); <-- Now if contains 1 float, this is 4 bytes long.
    }
    

    【讨论】:

    • 如果我的回答有帮助,请考虑投票或将其标记为正确。无论如何,请查看“typedarray-to-buffer”的代码。对于像Float32Array 这样的TypedArrays,它所做的只是调用Buffer.from(arr.buffer); 因此我仍然坚持我的答案:它在没有第三方库的情况下简洁地回答了这个问题。换句话说,提供interleave: true 然后使用Buffer.from 可以正常工作。 github.com/feross/typedarray-to-buffer/blob/master/index.js#L16
    【解决方案2】:

    我认为您误解了readRasters 的返回类型。据我从docs 得知,默认情况下它不是Float32Array,而是一组数组(每个通道一个,例如R、G 和B)。

    默认情况下,栅格被拆分为每个组件的单独数组。例如,对于 RGB 图像,我们会得到三个数组,一个用于红色、绿色和蓝色。

    尝试将{interleave: true} 传递给readRasters

    如果我们想要将所有波段交错在一个大数组中,我们必须传递 interleave: true 选项:

    在那之后Buffer.from 什么都做不了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-14
      • 2022-08-05
      • 2018-06-29
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2021-04-04
      相关资源
      最近更新 更多