无法将缓冲字节数组解析为浏览器中的图像

时间:2016-11-03 11:08:18

标签: javascript arrays image byte blob

我试图从缓冲的字节数组创建一个图像。这是因为我使用json将图像从服务器发送到客户端。这是代码:

客户端用index.html文件表示。

// index.html

<img id="ItemPreview">

<script>
    var socket = new WebSocket("ws://localhost:8080");
    socket.onopen = function(event){
        setTimeout(function(){
            var message = JSON.stringify({"task" : "initialize", "data" : ""});
            socket.send(message);
        }, 1000);
    };
    socket.onmessage = function(event){
        var json = JSON.parse(event.data);
        if(json.task == "display-image"){
            console.log("From Client\t\t: " + json);
            console.log(json.data.data);
            var urlCreator = window.URL || window.webkitURL;
            //var imageUrl = urlCreator.createObjectURL(json.data);
            var imageUrl = urlCreator.createObjectURL(new Blob(json.data.data));
            document.querySelector("#ItemPreview").src = imageUrl;
            //document.querySelector("#ItemPreview").src = "data:image/png;base64," + json.data.data;
            var message = JSON.stringify({  "task" : "get-image", "data" : ""});
            socket.send(message);
        }
    };

</script>

我也尝试了评论中的内容,但无法实现...

服务器用index.js文件表示。

// index.js

var server = require('ws').Server;
var s = new server({ port : 8080 });
var fs = require('fs');

s.on('connection', function(ws){

    ws.on('message', function(message){
        var json = JSON.parse(message);
        console.log("From Server:\t\t" + json);
        if(json.task == "initialize"){
            var image = fs.readFileSync("./img/1.jpg");
            var messageToSend = JSON.stringify({
                "task" : "display-image",
                "data" : image
            });
            ws.send(messageToSend);
        }
    });

    ws.on('close', function(){
        console.log("I lost a client");
    });

});

这只是一个简单的问题,但我已经在论坛中搜索,但无法解决我的问题。如果有人可以帮助我,我会很感激,谢谢!

1 个答案:

答案 0 :(得分:0)

这将有效:

function _arrayBufferToBase64(buffer) {
    var binary = '';
    var bytes = new Uint8Array(buffer);
    var len = bytes.byteLength;
    for (var i = 0; i < len; i++) {
        binary += String.fromCharCode(bytes[i]);
    }
    return window.btoa(binary);
}

socket.onmessage = function (event) {
    var json = JSON.parse(event.data);
    if (json.task == "display-image") {
        var imageUrl = _arrayBufferToBase64(json.data.data);
        document.querySelector("#ItemPreview").src = "data:image/png;base64," + imageUrl;
        var message = JSON.stringify({"task": "get-image", "data": ""});
        socket.send(message);
    }
};