canvas
टैग का उपयोग करना, आप किसी दिए गए स्थान के तहत एक पिक्सेल के रंग मूल्य निर्धारित कर सकते हैं। आप निर्देशांक निर्धारित करने के लिए ईवेंट डेटा का उपयोग कर सकते हैं, फिर पारदर्शिता की जांच करें। यह सब बनी हुई है जो छवि को कैनवास में लोड कर रही है।
सबसे पहले, हम इस बात का ध्यान रखेंगे:
var ctx = document.getElementById('canvas').getContext('2d');
var img = new Image();
img.onload = function(){
ctx.drawImage(img,0,0);
};
img.src = [YOUR_URL_HERE];
यह पहली बिट पकड़ लेता है कैनवास तत्व है, तो एक Image
वस्तु बनाता है। जब छवि लोड होती है, तो यह कैनवास पर खींची जाती है। बहुत सीधा! इसके अलावा ... यदि छवि कोड के समान डोमेन पर नहीं है, तो आप उसी डोमेन नीति सुरक्षा के विरुद्ध हैं। हमारी छवि का डेटा प्राप्त करने के लिए, हमें स्थानीय रूप से होस्ट होने वाली छवि की आवश्यकता होगी। आप अपनी छवि को बेसोड एन्कोड भी कर सकते हैं, जो इस उत्तर के दायरे से बाहर है। (ऐसा करने के लिए टूल के लिए this url देखें)।
अगला, कैनवास पर अपना क्लिक ईवेंट संलग्न करें। जब कि क्लिक में आता है, हम पारदर्शिता के लिए जाँच करें और केवल गैर-पारदर्शी क्लिक क्षेत्रों के लिए कार्य करेंगे:
if (isTransparentUnderMouse(this, e))
return;
// do whatever you need to do
alert('will do something!');
जादू समारोह isTransparentUnderMouse
है, जो दो तर्क की जरूरत में क्या होता है: में लक्ष्य कैनवास तत्व (this
हैंडलर के दायरे पर क्लिक करें) और घटना डेटा (ई, इस उदाहरण में)। अब हम मांस पर आते हैं:
var isTransparentUnderMouse = function (target, evnt) {
var l = 0, t = 0;
if (target.offsetParent) {
var ele = target;
do {
l += ele.offsetLeft;
t += ele.offsetTop;
} while (ele = ele.offsetParent);
}
var x = evnt.page.x - l;
var y = evnt.page.y - t;
var imgdata = target.getContext('2d').getImageData(x, y, 1, 1).data;
if (
imgdata[0] == 0 &&
imgdata[1] == 0 &&
imgdata[2] == 0 &&
imgdata[3] == 0
){
return true;
}
return false;
};
सबसे पहले, हम प्रश्न में तत्व की सटीक स्थिति प्राप्त करने के लिए कुछ नृत्य करते हैं। हम कैनवास तत्व को पास करने के लिए उस जानकारी का उपयोग करने जा रहे हैं। getImageData
हमें अन्य चीज़ों के साथ, data
ऑब्जेक्ट देगा जिसमें हमारे द्वारा निर्दिष्ट स्थान के आरजीबीए शामिल हैं।
यदि ये सभी मान 0 हैं, तो हम पारदर्शिता को देख रहे हैं। यदि नहीं, तो कुछ रंग मौजूद है। -एडिट- जैसा कि टिप्पणियों में उल्लेख किया गया है, उपरोक्त उदाहरण में हमें केवल एक ही मूल्य देखने की आवश्यकता है, imgdata[3]
। मान आर (0) जी (1) बी (2) ए (3) हैं, और पारदर्शिता ए, अल्फा द्वारा निर्धारित की जाती है। आप किसी भी अस्पष्टता पर किसी भी रंग को खोजने के लिए इस दृष्टिकोण का उपयोग कर सकते हैं जिसे आप आरजीबीए डेटा जानते हैं।
यहाँ इसे आजमाएं: http://jsfiddle.net/pJ3MD/1/
(ध्यान दें:। मेरे उदाहरण में, मैं डोमेन सुरक्षा मैंने कहा आप कोड के उस भाग की उपेक्षा कर सकते जब तक कि आप भी चाहते हैं की वजह से एक बेस 64 इनकोडिंग छवि का इस्तेमाल किया माउस कर्सर में परिवर्तन मनोरंजन के लिए में फेंक दिया के साथ बेस 64 एन्कोडिंग)
एक ही उदाहरण के लिए, का उपयोग करने पर: http://jsfiddle.net/pJ3MD/2/
प्रलेखन
MDN पर
आप की जरूरत है ऐसा करने के लिए क्योंकि छवियों को गतिशील रूप से उत्पन्न किया जाएगा? जबकि मुझे यकीन है कि यह जावास्क्रिप्ट में किया जा सकता है, यह शायद धीमा होने जा रहा है। फ़ोटोशॉप में "जादू की छड़ी" और क्या नहीं है, इसे "इसे सही" करने के लिए तुच्छ नहीं है। ऐसा लगता है कि यदि आप छवियों को गतिशील रूप से उत्पन्न कर रहे हैं, तो छविमैप बनाने के लिए स्रोत डेटा का उपयोग करें। यदि आप नहीं हैं, तो इसे ऑफ़लाइन क्यों न करें और छविमैप का उपयोग क्यों करें? –
हाँ, जो गतिशील रूप से होने जा रहा है क्योंकि छवियों को भी गतिशील रूप से लोड किया जाएगा ... – lviggiani