【问题标题】:javascript draw image into html from buffer (nodejs/socket.io)javascript从缓冲区(nodejs/socket.io)将图像绘制到html中
【发布时间】:2011-09-06 16:26:41
【问题描述】:

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

来自nodejs服务器的数据使用socket.io推送到网页中

此数据是完整的图像,我尝试写入磁盘以查看图像并且很好。 将数据放入缓冲区以在 base64 中编码,然后发送到网页,我尝试使用 '数据:图像/png;base64,'+数据 但什么也没发生……数据似乎是“完整的”,包括 PNG 图像的标题。

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

一些代码: 服务器端

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 编码没有图像。

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您的客户端代码看起来不错(除了.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);
      }
      

      【讨论】:

      • 我像您评论@Stoive 一样更改了我的receiveImage 函数,但是这会在网页中写入一个类似于“二进制”数据的字符串并且图像不显示.. 所以我使用缓冲区来编码image.data 到 base64 并使用 socket.broadcast 推送此数据。在网页中,我得到如下信息: 并且没有显示图像。跨度>
      • 传递给此函数的image 对象是什么?我假设 image.data 是 Buffer 对象,我错了吗?
      【解决方案3】:

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

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

      【讨论】:

      • 但这与我所说的无关。你不要把“localhost:8080/”放在它前面。你只放数据网址。 en.wikipedia.org/wiki/Data_URI_scheme
      • 嗯,那个数据 URI 看起来有点不对……介于 CSS 和普通之间。它附加了localhost:8080,因为这是加载主页的位置,src attr 被解释为相对 URL。
      • 使用 src attr 像 "data(PNGIHDRKIDAT......ENDB)" 浏览器尝试指向 localhost:8080/data() .. 显然这不存在..但如果我使用维基百科帖子数据中的数据 url:image/png;base64,PNGIHDRKIDAT....ENDB 图像不显示,但没有 404
      • 嗯,从“加载时 404”转变为“不显示但没有 404”听起来像是朝着正确方向迈出的一步。我不确定你的编码是如何工作的,但在我看来,你在 base64 中编码了两次。那也行不通。最后,你说的是这个 HEADER 和 TAIL,但是 base64 中没有这个东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多