
कुछ समय पहले मैंने अपने
एंड्रॉइड एप्लिकेशन कलरिंग बुक और एप्लिकेशन से चित्रों और चित्रों को प्रकाशित करने के लिए एक
ऑनलाइन गैलरी के बारे में
लिखा था । ब्राउज़र-आधारित ऑनलाइन कलरिंग का विचार काफी तार्किक है, लेकिन किसी भी तरह से बैठने और इसे करने के लिए कोई प्रोत्साहन नहीं था। यह स्पष्ट था कि मुझे उन तकनीकों का उपयोग करना होगा, जिनके साथ मैंने काम नहीं किया और यह बहुत प्रेरणादायक नहीं थी। लेकिन किसी तरह समय दिखाई दिया और मैंने कोशिश करने का फैसला किया। आगे देखते हुए, मैं कहता हूं कि इस प्रक्रिया में, ब्राउज़रों के काफी अप्रयुक्त गुण प्रकट किए गए थे। यह पता चला कि ऑनलाइन कंपाइलर (विशेष रूप से C ++) हैं जो विंडोज़ और लिनक्स के लिए निष्पादन योग्य फ़ाइलों का उत्पादन करते हैं। और इसके अलावा, मुझे पहली बार लिनक्स (उबंटू) स्थापित करना पड़ा।
इसलिए, मुख्य इच्छा रंग एल्गोरिथ्म को स्वयं छिपाने की कोशिश करना थी। नतीजतन, जेएस पर एल्गोरिथ्म का कार्यान्वयन गायब हो जाता है। यह या तो किसी अन्य ब्राउज़र तकनीक का उपयोग करता है, या केवल ड्राइंग पर ब्राउज़र छोड़ता है, और सर्वर पर "गणना" रंग देता है।
पहली बात जो दिमाग में आती है वह है फ्लैश। कुछ हद तक, यह आपको कोड की सुरक्षा करने की अनुमति देता है, और एक ही समय में, आप एक आवेदन में ड्राइंग और रंग संयोजन कर सकते हैं। लेकिन मैंने कभी भी फ्लैश के साथ काम नहीं किया। मैंने एक ट्रायल एडबाय फ्लैश स्थापित किया, एक समान उदाहरण डाउनलोड किया और ... किसी तरह फ्लैश के साथ काम नहीं किया। मुझे इस विकल्प को स्थगित करना पड़ा और कुछ और प्रयास करना पड़ा।
अगला विकल्प एक ब्राउज़र-आधारित जावा एप्लिकेशन था। लेकिन अतिरिक्त सॉफ्टवेयर चलाने के लिए एप्लिकेशन की आवश्यकता के कारण वह दूर हो गया।
इसलिए मैंने आसानी से ब्राउजर ड्रॉइंग और सर्वर काउंटिंग का विकल्प खोज लिया।
ब्राउज़र ड्राइंग कैनवास या svg है। लेकिन यह कलरिंग एल्गोरिदम के दृष्टिकोण से ब्राउज़रों की एक बहुत बुरी विशेषता है। रेखाएँ खींचते समय, गैर-अक्षम एंटीलियासिंग का उपयोग किया जाता है। पहले तो पृष्ठभूमि रंग के साथ कम से कम कुछ पारदर्शी पिक्सेल के इस सॉफ़्टवेयर प्रतिस्थापन का मुकाबला करने का प्रयास किया गया। लेकिन जैसा कि यह निकला, पारदर्शिता सब कुछ नहीं है। चौरसाई न केवल पारदर्शिता के माध्यम से होती है - बल्कि रंग में भी होती है। अर्थात्, इसकी संरचना में खींची गई और "अपारदर्शी" एकल-रंग रेखा में पिक्सेल होते हैं जो 5 इकाइयों तक एक या एक से अधिक RGB घटकों में भिन्न होते हैं। मेरे मामले में, यह एक गंभीर समस्या है, क्योंकि एल्गोरिथ्म को एकल-रंग लाइन के लिए एक ही रंग के सभी पिक्सेल मिलना चाहिए। और इसे दो तरीकों से हल किया जाता है। या तो वांछित रंग के पिक्सल के साथ "समान" पिक्सल के कृत्रिम प्रतिस्थापन के साथ प्रीप्रोसेसिंग, या पिक्सेल-बाय-पिक्सेल ड्राइंग। दूसरा रास्ता चुना गया - putImageData के माध्यम से ड्राइंग। सच है, मुझे दो बिंदुओं को जोड़ने वाले पिक्सेल "लाइन" के लिए एक खोज फ़ंक्शन लिखना था।
ठीक है, पहले सन्निकटन के रूप में ड्राइंग के साथ सब कुछ स्पष्ट है। छवि को सर्वर पर स्थानांतरित करने के लिए, jquery का उपयोग करें। अब सर्वर सॉल्वर।
सबसे पहले, मैंने C ++ से PHP में कलरिंग एल्गोरिदम को पोर्ट किया। यह बहुत महंगा निकला - यहां तक कि दो रंग लाइनों के साथ एक छोटे आकार की छवि (200x300) को लगभग 40 सेकंड के लिए चित्रित किया गया है। हमें ऐसी हॉकी की जरूरत नहीं है। इसलिए, मैं सी ++ एप्लिकेशन की दिशा में सोचना शुरू करता हूं, जो या तो सर्वर पर एक सेवा के रूप में चलता है, या पीएचपी नियंत्रक द्वारा लॉन्च किया जाता है। यहाँ कठिनाइयाँ पहले से ही संगठनात्मक थीं। सबसे पहले, सेवा शुरू करने के लिए, रूट अधिकारों के साथ एक समर्पित सर्वर होने के अलावा, आपको इसे प्रशासित करने में भी सक्षम होना चाहिए। और मैं, दुर्भाग्य से, आवश्यक कौशल के अधिकारी नहीं हैं। यहां मैं पहली बार बहुत खुशकिस्मत थी। मेरे "नियमित" होस्टिंग साइटों में से एक, PHP में निष्पादन को चलाने की क्षमता उपलब्ध थी। यह लिनक्स के तहत निर्माण करने के लिए उपयोगिता पर निर्भर था। दुर्भाग्य से, मेरे पास यहां या तो पर्याप्त अनुभव नहीं था, इसलिए मैंने ऑनलाइन कंपाइलरों की खोज में कुछ समय बिताया। केवल एक
www.onlinecompiler.net मिला, और यहां तक कि बहु-फ़ाइल परियोजनाओं को संकलित करने की क्षमता के बिना। लेकिन यह परीक्षणों के लिए पर्याप्त था (http पर एक स्क्रिप्ट-नियंत्रक को कॉल करना संभव था जो एक खाली कार्यक्रम चलाता था और एक मान लौटाता था)।
पीछे हटने में बहुत देर हो चुकी थी, और मैंने ubuntu को स्थापित करने का प्रयास करने का निर्णय लिया। मैंने छवि डाउनलोड की, इसे vmware के माध्यम से लॉन्च किया और "लिनक्स में परियोजनाओं को संकलित करना" विषय पर साहित्य पढ़ना शुरू किया :) :) यहां मैं दूसरी बार भाग्यशाली था, क्योंकि लगभग आधा किक मैंने अपनी परियोजना को एक निष्पादन योग्य फ़ाइल में संकलित करने में कामयाब रहा।
यदि आप, उपयोगकर्ता नाम, कभी पक्की पहेलियां, तो आप उस भावना को याद करेंगे जब आपके पास पहले से ही कई इकट्ठे बड़े लेकिन अलग-अलग टुकड़े आपकी मेज पर होंगे और अब, अंत में, वे एक साथ जुड़ना शुरू करते हैं। हां, सफलतापूर्वक निष्पादन योग्य बनाने के बाद, मैंने उसी चीज के बारे में महसूस किया।
यह एक छोटी सी बात थी। Js पर आरेखण के साथ सर्वर पर index.php अपलोड करें, जिसमें solver.php अपलोड करें जिसमें ब्राउज़र "नौकरी" भेजता है और रंग प्राप्त करता है, बाहर निकालता है और a.out निष्पादन योग्य के लिए निष्पादन झंडे सेट करता है, और इसी तरह, छोटी चीजों में।
और चेन में जान आ गई।
नतीजतन, JS आपको एक कार्य आकर्षित करने की अनुमति देता है और इसे AJAX के रूप में सर्वर-साइड PHP नियंत्रक का उपयोग करके PNG फ़ाइल के रूप में भेजता है। नियंत्रक PNG को स्वीकार करता है, इसे खोलता है, कुछ प्रीप्रोसेसिंग करता है, परिणाम को अस्थायी BMP पर सेट करता है और सेट करता है ।/a.out इसके लिए। वह बीएमपी खोलता है, रंग करता है, परिणाम को एक नया बीएमपी बचाता है और पीएचपी नियंत्रक पर वापस नियंत्रण स्थानांतरित करता है। नियंत्रक परिणाम को खोलता है, इसे जेपीईजी में दबाता है, सभी मध्यवर्ती फ़ाइलों को हटाता है और जेपीईजी छवि का पता लंबित अन्य अनुरोध को देता है। क्लाइंट जेएस, छवि का पता प्राप्त करता है, एक टैग बनाता है और उपयोगकर्ता को ब्राउज़र में सभी काम का परिणाम दिखाता है।
यह योजना आदर्श से बहुत दूर है। और यह भी नहीं है कि फ़ाइल जोड़तोड़ का सभ्य हिस्सा C ++ पक्ष में पारित किया जा सकता है। एक अच्छे तरीके से, एप्लिकेशन को सेवा को स्पिन करना चाहिए। खैर, या अंतिम उपाय के रूप में php एक्सटेंशन के रूप में उपयोग किया जाता है। लेकिन यह आपको पूर्ण गर्भनाल की भावना को महसूस करने से नहीं रोकता है :)
पुनश्च: जो लोग एमयू करना चाहते हैं -
विधानसभा का एक
परीक्षण संस्करण । लोड को कम करने के लिए (और यह एक सामान्य साझा होस्टिंग है), "कार्य" का आकार 250x350 पिक्सेल तक सीमित है, और रंगों की संख्या 15 है। कम से कम दो रंग रेखाएँ खींचें, पेंटअप दबाएं और एक रंग प्राप्त करें। कृपया दुरुपयोग न करें :)
PPS: रंग हटा दिया जाएगा, इसलिए यदि आप इसे स्मृति में रखना चाहते हैं, तो इसे स्थानीय रूप से सहेजें।