gpt4 book ai didi

javascript - 将 Float32Array 转换为缓冲区

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:29 25 4
gpt4 key购买 nike

我正在尝试返回浮点的二进制数组。我从 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)”的结果是一个单字节长度的缓冲区。

最佳答案

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

By default, the raster is split to a separate array for each component. For an RGB image for example, we'd get three arrays, one for red, green and blue.

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

If we want instead all the bands interleaved in one big array, we have to pass the interleave: true option:

之后Buffer.from就成功了。

关于javascript - 将 Float32Array 转换为缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59652703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com