javascript从缓冲区(nodejs / socket.io)将图像绘制成html

时间:2011-06-01 21:58:35

标签: javascript node.js socket.io

(对不起我的英文) 嗨,我有一个用nodejs创建的应用程序,用于将图像数据推送到网页中。

使用socket.io

将来自nodejs服务器的数据推送到网页

此数据是完整的图像,我尝试写入光盘以查看图像并且很好。 将数据放入缓冲区以在base64中编码,然后发送到网页,我尝试显示使用 '数据:图像/ PNG; BASE64,' +数据 但没有任何事情......数据似乎是“完整的”,包括PNG图像的标题。

服务器使用thrift与另一个客户端通信(这在C ++中),这个客户端创建图像并发送到nodejs-thrift服务器,当接收到图像时,nodejs-socket.io服务器推入网页。 / p>

一些代码: 服务器端

var http = require('http'),
url = require('url'),
fs  = require('fs'),
sys = require('sys');
var hserver = http.createServer(function(request,response){
var path = url.parse(request.url).pathname;
switch(path){
   case '/':

        fs.readFile(__dirname + '/index.html',function(err,data){
           if(err) return send404(res);
           response.writeHead(200,{'Content-Type':'text/html'});
           response.write(data,'utf8');
           response.end(); 
        });
    break;
    default: send404(response);
}
   }),
send404 = function(res){
 res.writeHead(404);
 res.write('404');
 res.end();
};

hserver.listen(8080);
var io = require('socket.io');
var socket = io.listen(hserver);
//this is the function in the Thrift part to send the image data to webpage using socket.io
var receiveImage = function(image,success){
buff= new Buffer(image.data.toString('base64'),'base64');
socket.broadcast({
    data: buff.toString('base64'),
    width: image.width,
    height: image.height
});
success(true);
}

在网页中我尝试使用socket.io的on.message回调加载图像

<script>
var socket = new io.Socket(null,{port:8080});
socket.connect();
socket.on('message',function(obj){
        document.getElementById('imagenes').src='data:image/png;base64,'+obj.data.toString();
});
socket.on('connect',function(){         
    document.getElementById('stream').innerHTML = "Conectado!"
});
</script>

但我看不到图像.. obj.data.toString('base64')创建一个这样的字符串:

 PNGIHDRKIDATxYw5L1LlFMM/migzWUadOadLUd+43PIfPU9VU5AJAg3dIWUmHAMajS8GUuq ............
 .............
 /NIlWDHUDmIPdHIEND

是图像的所有数据..

我怎样才能显示图像? (可能使用img标签或画布)

提前致谢。

编辑:对代码进行了一些更改,但没有任何变化..我猜...图片不显示,因为数据(PNGIHDRKIDATxYw ...... PdHIENDB)不是正确的数据..我搜索这个和用于显示图像内联的png数据是不同的(没有标题PNGIHDRKIDAT和尾部ENDB),我删除标题和尾部,不显示..也许我收到的数据不正确,但如果我尝试使用nodejs(fs)写入服务器端的文件系统我得到正确的图像(使用二进制文件fs.writeFileSync(“imagen.png”,image.data.toString('binary'),'binary'))编码,但使用base64编码没有图像。

3 个答案:

答案 0 :(得分:2)

在C ++方面(我创建图像并将它们发送到nodejs服务器)。我需要在base64中编码数据。然后在节点i中将此数据放入具有base64编码的缓冲区并将其发送到网页。

答案 1 :(得分:1)

您的客户端代码看起来很好(除了.toString('base64')在浏览器中对String对象没有任何作用的事实,只有节点中的Buffer对象,我猜测问题出在receiveImage,应该是:

var receiveImage = function(image,success) {
    socket.broadcast({
        data: image.data.toString('base64'),
        width: image.width,
        height:image.height
    });
    success(true);
}

答案 2 :(得分:0)

根据我的经验,应该使用如下数据网址加载图像的base64字符串:

<img alt="some image" src="data(PNGIHDRKIDATxYw5L1LlFMM/migzWUadOadLUd+43PIfPU9VU5AJAg3dIWUmHAMajS8GUuq .........)" />