通过networking套接字快速发送base64string?

我试图创build一个videostream,通过捕获和JPEG图像转换成base64string,然后发送它使用websockets(Nodejs和socket.io)在HTML5canvas上绘图。 这是C#中用于捕获屏幕并使用SocketIO4Net库发送的代码:

Client directSocket = new Client("http://IPHERE"); directSocket.Connect(); private void timer1_Tick(object sender, EventArgs e) { Rectangle bounds = Screen.GetBounds(Point.Empty); Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height); using (Graphics g = Graphics.FromImage(bitmap)) { g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size); } pictureBox1.Image = bitmap; // Convert the pictureBox into a byte[] array System.IO.MemoryStream stream = new System.IO.MemoryStream(); pictureBox1.Image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); byte[] imageBytes = stream.ToArray(); // Convert byte[] to Base64 string string base64String = Convert.ToBase64String(imageBytes); // Send using SocketIO4Net directSocket.Emit("send", new { message = base64String }); } 

这工作正常,base64String被发送到节点服务器发出它。 这是客户端JavaScript代码:

 var socket = io.connect('IPHERE'); socket.on('receive', function (data) { var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); var img = new Image(); img.onload = function () { context.drawImage(img, 0, 0, canvas.width, canvas.height); }; img.src = "data:image/jpeg;base64," + data.message.message; }); 

我的问题是,base64String很大,并不足以让客户端接收并显示在canvas上的图像。 我不确定它是否是我的节点服务器(这是一个便宜的VPS),或者如果string太大。 是否有可能压缩base64String,然后发送它解压缩时收到? 或者有另外一种方法可以做到这一点? 谢谢您的帮助。

您可以尝试将图像保存为质量较低的jpg。 您可以使用接受编码器和编码器参数的保存覆盖。

如果您只需要支持现代浏览器,请使用canvas元素并通过原始字节发送数据。 使用ImageData对象将数据推送到canvas元素。

有关如何创buildImageData对象的更多信息,请参阅MDN文章“使用canvas进行像素操作” 。

lYesterday我用c#testing它 – 以base64 – websocket – 连接到gwt(java脚本)img对象。 我在内联网中使用它,stream的性能很好。 但是,如果你testing它,你会看到Firefox中的内存泄漏。 因为Firefoxcaching所有图像。 在我的情况下,每秒10张图片。 一个图片200kb。 这个弱我testingcanvas的一部分。