क्या यह जांचने का कोई तरीका है कि क्या PNG छवि का एक चयनित (x, y) बिंदु पारदर्शी है?
क्या यह जांचने का कोई तरीका है कि क्या PNG छवि का एक चयनित (x, y) बिंदु पारदर्शी है?
जवाबों:
जेफ के जवाब पर बिल्डिंग, आपका पहला कदम अपने पीएनजी का एक कैनवास प्रतिनिधित्व बनाना होगा। निम्नलिखित एक ऑफ-स्क्रीन कैनवास बनाता है जो आपकी छवि के समान चौड़ाई और ऊंचाई है और उस पर चित्र खींचा गया है।
var img = document.getElementById('my-image');
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);
उसके बाद, जब कोई उपयोगकर्ता क्लिक करता है, उपयोग करता है event.offsetX
और event.offsetY
स्थिति प्राप्त करता है। इसके बाद पिक्सेल प्राप्त करने के लिए इस्तेमाल किया जा सकता है:
var pixelData = canvas.getContext('2d').getImageData(event.offsetX, event.offsetY, 1, 1).data;
क्योंकि आप केवल एक पिक्सेल ले रहे हैं, पिक्सेलडाटा एक चार प्रविष्टि सरणी है जिसमें पिक्सेल का R, G, B और A मान हैं। अल्फा के लिए, 255 से कम कुछ भी 0 के पूर्ण स्तर पर पारदर्शी होने के साथ पारदर्शिता के कुछ स्तर का प्रतिनिधित्व करता है।
यहाँ एक jsField उदाहरण है: http://jsfiddle.net/thirtydot/9SEMf/869/ मैंने इस सब में सुविधा के लिए jQuery का उपयोग किया, लेकिन यह किसी भी तरह से आवश्यक नहीं है।
नोट: getImageData
डेटा लीक को रोकने के लिए ब्राउज़र की समान-मूल नीति के अंतर्गत आता है, मतलब यह तकनीक विफल हो जाएगी यदि आप किसी अन्य डोमेन से छवि के साथ कैनवास को गंदा करते हैं या (मेरा मानना है, लेकिन कुछ ब्राउज़रों ने इसे हल किया हो सकता है) किसी भी डोमेन से एसवीजी। यह उन मामलों से बचाता है जहां साइट उपयोगकर्ता में लॉग इन के लिए एक कस्टम छवि संपत्ति का कार्य करती है और एक हमलावर जानकारी प्राप्त करने के लिए छवि को पढ़ना चाहता है। आप एक ही सर्वर से छवि की सेवा करके या क्रॉस-मूल संसाधन साझाकरण को लागू करके समस्या को हल कर सकते हैं ।
.width
और सुरक्षित होने के लिए सुरक्षित है .height
।
कैनवास ऐसा करने का एक शानदार तरीका होगा, जैसा @pst ने ऊपर कहा है। एक अच्छे उदाहरण के लिए इस उत्तर को देखें:
कुछ कोड जो आपको विशेष रूप से प्रदान करेंगे:
var imgd = context.getImageData(x, y, width, height);
var pix = imgd.data;
for (var i = 0, n = pix.length; i < n; i += 4) {
console.log pix[i+3]
}
यह पंक्ति से पंक्ति में जाएगा, इसलिए आपको इसे x, y में परिवर्तित करने की आवश्यकता होगी और या तो लूप के लिए एक सीधी जांच में परिवर्तित करना होगा या एक सशर्त अंदर चलाना होगा।
अपने प्रश्न को फिर से पढ़ना, ऐसा लगता है कि आप उस बिंदु को प्राप्त करने में सक्षम होना चाहते हैं जिस पर व्यक्ति क्लिक करता है। यह jquery के क्लिक इवेंट के साथ बहुत आसानी से किया जा सकता है। बस उपरोक्त कोड को एक क्लिक हैंडलर के अंदर चलाएं जैसे:
$('el').click(function(e){
console.log(e.clientX, e.clientY)
}
उन लोगों को आपका x और y मान हड़पने चाहिए।
पिछले दो उत्तर प्रदर्शित करते हैं कि कैनवस और इमेजडाटा का उपयोग कैसे करें। मैं एक जवाब देने के लिए उदाहरण के साथ रन करने योग्य उदाहरण और एक इमेज प्रोसेसिंग फ्रेमवर्क का उपयोग करना चाहता हूं, इसलिए आपको पिक्सेल डेटा को मैन्युअल रूप से संभालने की आवश्यकता नहीं है।
MarvinJ विधि प्रदान करता है image.getAlphaComponent (x, y) जो केवल x, y कोऑर्डिनेट में पिक्सेल के लिए पारदर्शिता मान देता है। यदि यह मान 0 है, तो पिक्सेल पूरी तरह से पारदर्शी है, 1 और 254 के बीच के मूल्य पारदर्शिता स्तर हैं, अंत में 255 अपारदर्शी है।
प्रदर्शन के लिए मैंने नीचे की छवि (300x300) को पारदर्शी पृष्ठभूमि के साथ और निर्देशांक (0,0) पर दो पिक्सेल और (150,150) का उपयोग किया है ।
कंसोल आउटपुट:
(0,0):
ट्रांसपेरेंट (150,150): NOT_TRANSPARENT
image = new MarvinImage();
image.load("https://i.imgur.com/eLZVbQG.png", imageLoaded);
function imageLoaded(){
console.log("(0,0): "+(image.getAlphaComponent(0,0) > 0 ? "NOT_TRANSPARENT" : "TRANSPARENT"));
console.log("(150,150): "+(image.getAlphaComponent(150,150) > 0 ? "NOT_TRANSPARENT" : "TRANSPARENT"));
}
<script src="https://www.marvinj.org/releases/marvinj-0.7.js"></script>