Hay varias maneras que recomendaría dependiendo del eje de eficiencia que desee (ancho de banda frente a la eficiencia de la CPU).
Opción 1: Puede utilizar el método canvas toDataURL. Esto devuelve una imagen codificada en base64 de los datos de imagen del lienzo.Se comprimirá utilizando el formato de imagen que especifique (o PNG para el valor predeterminado) y se codificará previamente en base64 para enviarlo a través de WebSocket.
canvas = document.getElementById("mycanvas");
b64png = canvas.toDataURL();
ws.send(b64png);
Opción 2: Si puede tolerar la compresión con pérdida, entonces puede pedir la imagen como un base64 JPEG a partir del método toDataURL:
canvas = document.getElementById("mycanvas");
b64jpeg = canvas.toDataURL("image/jpeg");
ws.send(b64jpeg);
Opción 3: Si está utilizando un navegador que admite datos binarios de WebSocket (Chrome, Firefox, IE 10), puede enviar el lienzo arraybuffer directamente a través de WebSocket
canvas = document.getElementById("mycanvas");
ctx = canvas.getContext('2d');
imgdata = ctx.getImageData(0,0, width, height).data; // This is a Uint8ClampedArray
ws.send(imgdata.buffer); // Send the ArrayBuffer from the Uint8ClampedArray
La opción 3 probablemente sea la menos eficiente en términos de ancho de banda, pero la más eficiente en términos de potencia de procesamiento en el lado del cliente y del servidor porque los datos de imagen se envían en bruto con poco procesamiento pre/post requerido.
La opción más eficiente en ancho de banda probablemente será # 2, pero perderá algo de calidad de imagen durante la conversión de los datos de imagen a formato JPEG. Incluso podría ir más allá y base64 decodificar los datos en un arraybuffer o blob y enviarlos a través de WebSocket binario para que no obtenga el 33% de ancho de banda base64, pero esto agrega aún más sobrecarga de CPU.
Si desea un ancho de banda eficiente sin perder calidad de imagen, la opción n. ° 2 es su mejor opción.
Algunas notas/advertencias:
El toDataURL antepuesta al algo datos base64 como esto:
"data:image/png;base64,iVBORw0KGgoAAAA..."
Una cosa agradable sobre el formato de URL datos es que se puede tomar todo el asunto y pegar en la barra de direcciones de su navegador y el navegador representará la imagen.
Consulte el MDN Canvas page para obtener más información sobre toDataURL.
@Esailija ¿Quizás ... es el consenso para codificar las cadenas base64? – user730569
Qué tal esto http://stackoverflow.com/questions/6869926/websockets-and-binary-data. Realmente, solo estoy buscando google aquí: D – Esailija
@Esailija, sí, pero ninguno de estos es realmente sobre la mejor manera de comprimir una cadena ... cómo enviar imágenes o datos binarios – user730569