कई तरीकों से मैं अनुशंसा करता हूं कि आप किस दक्षता की धुरी (बैंडविड्थ बनाम सीपीयू दक्षता) चाहते हैं।
विकल्प 1: आप कैनवास toDataURL विधि का उपयोग कर सकते हैं। यह कैनवास छवि डेटा की बेस 64 एन्कोडेड छवि देता है।यह आपके द्वारा निर्दिष्ट छवि प्रारूप (या डिफ़ॉल्ट के लिए पीएनजी) का उपयोग करके संपीड़ित किया जाएगा और इसे वेबस्केट पर भेजने के लिए बेस 64 पर पूर्व-एन्कोड किया जाएगा।
canvas = document.getElementById("mycanvas");
b64png = canvas.toDataURL();
ws.send(b64png);
विकल्प 2: आप हानिपूर्ण संपीड़न बर्दाश्त कर सकते हैं, तो आप एक बेस 64 toDataURL विधि से JPEG एन्कोडेड के रूप में छवि के लिए पूछ सकते हैं:
canvas = document.getElementById("mycanvas");
b64jpeg = canvas.toDataURL("image/jpeg");
ws.send(b64jpeg);
विकल्प 3: आप कर रहे हैं बाइनरी वेबसॉकेट डेटा (क्रोम, फ़ायरफ़ॉक्स, आईई 10) का समर्थन करने वाले ब्राउज़र का उपयोग करके आप सीधे वेबस्केट
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
पर कैनवास सरणी बफर भेज सकते हैं
विकल्प 3 बैंडविड्थ के मामले में कम से कम कुशल होगा, लेकिन क्लाइंट और सर्वर पक्ष पर प्रसंस्करण शक्ति के मामले में सबसे कुशल है क्योंकि छवि डेटा को पूर्व प्री/पोस्ट प्रोसेसिंग के साथ कच्चे भेजा जाता है।
सबसे बैंडविड्थ कुशल विकल्प # 2 होगा, लेकिन आप छवि डेटा के रूपांतरण के दौरान जेपीईजी प्रारूप में कुछ छवि गुणवत्ता खो देंगे। आप आगे भी जा सकते हैं और बेस 64 डेटा को एरेबफर या ब्लॉब में डीकोड कर सकते हैं और बाइनरी वेबसॉकेट के माध्यम से भेज सकते हैं ताकि आपको 33% बेस 64 बैंडविड्थ ओवरहेड नहीं मिल सके, लेकिन इससे और भी सीपीयू ओवरहेड जोड़ता है।
यदि आप किसी भी छवि गुणवत्ता को खोए बिना कुशल बैंडविड्थ चाहते हैं तो विकल्प # 2 आपकी सबसे अच्छी शर्त है।
कुछ नोट/चेतावनियां:
toDataURL इस तरह base64 डेटा कुछ उपसर्ग:
"data:image/png;base64,iVBORw0KGgoAAAA..."
डेटा URL स्वरूप के बारे में एक अच्छी बात यह है कि आप पूरी बात और पेस्ट ले सकता है यह आपके ब्राउज़र पता बार में है और ब्राउज़र छवि प्रस्तुत करेगा।
toDataURL के बारे में अधिक जानकारी के लिए MDN Canvas page देखें।
https://github.com/miohtama/Krusovice/blob/master/src/tools/resizer.js#L51
(गैर के लिए:
@Esailija शायद ... base64 एन्कोड तारों की सर्वसम्मति है? – user730569
इस बारे में http://stackoverflow.com/questions/6869926/websockets-and-binary- डेटा। असल में, मैं बस यहां Google खोज रहा हूं: डी – Esailija
@Esailija हाँ, लेकिन इनमें से कोई भी वास्तव में स्ट्रिंग को संपीड़ित करने का सबसे अच्छा तरीका नहीं है ... छवियों या बाइनरी डेटा को भेजने के तरीके के बारे में – user730569