Display image from blob using javascript and websockets

后端 未结 6 1365
春和景丽
春和景丽 2020-11-29 22:05

I\'m currently working on a WebSocket application that is displaying images send by a C++ server. I\'ve seen a couple of topics around there but I can\'t seem to get rid of

6条回答
  •  再見小時候
    2020-11-29 22:31

    I think the cleanest solution would be to change the base64 encoder to operate directly on a Uint8Array instead of a string.

    Important: You'll need to set the binaryType of the web socket to "arraybuffer" for this.

    The onmessage method should look like this:

    socket.onmessage = function(msg) {
        var arrayBuffer = msg.data;
        var bytes = new Uint8Array(arrayBuffer);
    
        var image = document.getElementById('image');
        image.src = 'data:image/png;base64,'+encode(bytes);
    };
    

    The converted encoder should then look like this (based on https://stackoverflow.com/a/246813/1464608):

    // public method for encoding an Uint8Array to base64
    function encode (input) {
        var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;
    
        while (i < input.length) {
            chr1 = input[i++];
            chr2 = i < input.length ? input[i++] : Number.NaN; // Not sure if the index 
            chr3 = i < input.length ? input[i++] : Number.NaN; // checks are needed here
    
            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;
    
            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }
            output += keyStr.charAt(enc1) + keyStr.charAt(enc2) +
                      keyStr.charAt(enc3) + keyStr.charAt(enc4);
        }
        return output;
    }
    

提交回复
热议问题