【发布时间】:2014-02-27 22:24:12
【问题描述】:
我有一个使用 node-png 创建的 PNG 对象,根据文档,它是“readable and writable Stream”。
我想将 PNG 对象转换为 base64 并通过 socket.io 将其发送到客户端,在那里我会将字符串放在图像 src 中。
我尝试了很多东西,但似乎将流转换为字符串并非易事。
我怎样才能做到这一点?
请注意,数据是在节点内部创建的,而不是从文件系统中创建的。
谢谢!
【问题讨论】:
我有一个使用 node-png 创建的 PNG 对象,根据文档,它是“readable and writable Stream”。
我想将 PNG 对象转换为 base64 并通过 socket.io 将其发送到客户端,在那里我会将字符串放在图像 src 中。
我尝试了很多东西,但似乎将流转换为字符串并非易事。
我怎样才能做到这一点?
请注意,数据是在节点内部创建的,而不是从文件系统中创建的。
谢谢!
【问题讨论】:
这是我为未来的读者所做的 (this helped too):
png.pack();
var chunks = [];
png.on('data', function(chunk) {
chunks.push(chunk);
console.log('chunk:', chunk.length);
});
png.on('end', function() {
var result = Buffer.concat(chunks);
console.log('final result:', result.length);
io.sockets.emit('image', result.toString('base64'));
});
【讨论】:
您不想将流转换为字符串,而是将其转换为可读块:
stream.on('readable', function() {
var string = stream.read().toString('base64');
// send through websocket
});
您也可以对流中运行的完整数据执行此操作:
var data = '';
stream.on('readable', function() {
data += stream.read().toString('base64');
});
stream.on('end', function() {
console.log(data);
});
取决于客户端是否需要完整的 png 图片可用,或者是否可以拥有单个块。
但是,如果您对实际示例(通过 HTML5 拖放上传的图像)的外观感兴趣,您可以查看 messenger。
【讨论】: