【问题标题】:How to save segements of image in memory from server request for merging later如何从服务器请求将图像片段保存在内存中以供以后合并
【发布时间】:2015-03-31 17:44:54
【问题描述】:

我有一个 nodejs 应用程序,它调用一个返回图像片段的服务器。我正在尝试将此段保存在缓冲区中,以便以后可以将它们合并在一起以制作完整图像

var req = http.request(options, function(res) {
        var segment = parseInt(res.headers["segment"]);
        res.setEncoding('binary');
        var data = "";

        res.on('data', function(chunk) {
            data += chunk;
        });

        res.on('end', function() {
            images[segment] = (new Buffer(data, 'binary'));
        });
    });

在我得到所有片段之后

var totalImage = "";
for (image in images) {
    totalImage += image.toString('binary');
}
fs.writeFile('image.png', totalImage, function(e) {
    console.log('done');
});

我想使用 node-pngjs,但我不确定如何将响应二进制流式传输到 png 中,以便我可以保存像素缓冲区而不是二进制本身以供以后使用

我尝试执行以下操作:

res.pipe(new PNG()).on('parse', function(err, data) {
    buffers[segment] = data;
});

但这会导致解析过程中出现错误“文件签名无效”

【问题讨论】:

  • 我认为您需要展示更多代码,包括如何管理buffers 变量、索引i 以及如何将所有数据写入文件。现在,您没有展示足够多的代码让我们了解您如何收集每个部分以及如何将所有部分写入文件。
  • 如果我是你,我会在你的请求处理程序中添加一个console.log(segment),以确保段号正确地出现在你的标题中。然后,您需要查看响应是否实际上是二进制(不是以其他方式编码),您可以通过查看 Chrome 调试器的网络标记中的响应和标头来做到这一点。

标签: node.js


【解决方案1】:

这里的问题可能不止一个,但这段代码不正确:

for (image in images) {
    totalImage += image.toString('binary');
}

在该代码中,image 是数组的索引(不是数组单元格的内容),因此您所做的只是将索引相加 0+1+2+3+4 等等。

数组不应该使用for/in 构造进行迭代,因为它会迭代对象的所有属性,而不仅仅是数组元素。而且,您也没有获取数组单元格的实际内容,它本来应该是images[image]。相反,您可以使用:

for (var i = 0; i < images.length; i++) {
    totalImage += images[i].toString('binary');
}

附:我怀疑你也可能有编码问题。您从 http 请求中获取数据,但将其全部转换为 Buffer 对象数组,然后将它们转换为“二进制”字符串并将它们一起添加到字符串变量中。由于这是二进制数据,看起来你应该只使用 Buffer 来收集东西,而不是字符串。


在 nodejs 中进一步研究 Buffers 之后,您可以像这样组合您的缓冲区数组:

var totalImage = Buffer.concat(images);

这会将所有内容保持为二进制缓冲区格式,并且不会有任何编码问题。找到了这个herehere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多