我正在尝试使用Jetty 8.1.2 WebSockets将一些二进制数据(图像)发送到javascript客户端。
websockets java code:
BufferedImage image = getTheImage();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
baos.flush();
byte[] imageInBytes = baos.toByteArray();
baos.close();
socket.getConnection().sendMessage(imageInBytes, 0, imageInBytes.length);
javascript代码:
binarySocket.onmessage = function(event) {
if (event.data instanceof ArrayBuffer) {
var bytearray = new Uint8Array(event.data);
var tempcanvas = document.createElement('canvas');
tempcanvas.height = imageheight;
tempcanvas.width = imagewidth;
var tempcontext = tempcanvas.getContext('2d');
var imgdata = tempcontext.getImageData(0, 0, imagewidth,imageheight);
var imgdatalen = imgdata.data.length;
for ( var i = 8; i < imgdatalen; i++) {
imgdata.data[i] = bytearray[i];
}
tempcontext.putImageData(imgdata, 0, 0);
var img = document.createElement('img');
img.height = imageheight;
img.width = imagewidth;
img.src = tempcanvas.toDataURL();
chatdiv = document.getElementById('chatdiv');
chatdiv.appendChild(img);
chatdiv.innerHTML = chatdiv.innerHTML + "<br />";
}
};
如果我将图像写在磁盘上,代码就可以了,但如果我尝试在HTML页面上显示图像,我会得到一些随机的彩色图像。 我可能以错误的方式编码图像。
知道如何将图像作为二进制数据发送并使用javascript显示吗?
答案 0 :(得分:3)
你是对的。问题是图像编码。
替换:
img.src = tempcanvas.toDataURL();
到
img.src = tempcanvas.toDataURL("image/jpeg");
默认格式为PNG。
答案 1 :(得分:2)
在我看来,这是错误的:
for ( var i = 8; i < imgdatalen; i++) {
imgdata.data[i] = bytearray[i];
}
您不能只将 bytearray 中的数据放在 imgdata.data 中,因为在您的情况下,bytearray已编码(jpeg)。毫不奇怪,你在一些画布上得到了随机像素(我估计在它的上方)。您需要将bytearray编码为data url,并将其设置为图像的src。不需要帆布。