কোনও পিএনজি চিত্রের নির্বাচিত (x, y) পয়েন্টটি স্বচ্ছ কিনা তা পরীক্ষা করার কোনও উপায় আছে কি?
কোনও পিএনজি চিত্রের নির্বাচিত (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;
আপনি কেবল একটি পিক্সেল দখল করছেন বলে, পিক্সেলডেটা পিক্সেলের আর, জি, বি, এবং মানগুলি সহ একটি চারটি প্রবেশ অ্যারে। আলফার জন্য, 255 এর চেয়ে কম যে কোনও কিছু সম্পূর্ণ স্বচ্ছ হওয়ার সাথে কিছুটা স্বচ্ছতার প্রতিনিধিত্ব করে।
এখানে একটি jsFizz উদাহরণ: http://jsfiddle.net/thirtydot/9SEMf/869/ আমি এই সমস্ত সুবিধার্থে jQuery ব্যবহার করেছি, তবে এটি কোনওভাবেই প্রয়োজন হয় না।
দ্রষ্টব্য: getImageData
ডেটা ফাঁস রোধ করতে ব্রাউজারের একই-উত্স নীতিটির অধীনে পড়ে, এর অর্থ এই কৌশলটি ব্যর্থ হবে যদি আপনি অন্য ডোমেন থেকে কোনও চিত্র দিয়ে ক্যানভাসটি নোংরা করেন বা (আমার বিশ্বাস, তবে কিছু ব্রাউজারগুলি এর সমাধান করতে পারে) কোনও ডোমেন থেকে এসভিজি। এটি কোনও ক্ষেত্রে লগ ইন হওয়া ব্যবহারকারীর জন্য কোনও কাস্টম চিত্রের সম্পদ সরবরাহ করে এমন ঘটনাগুলির বিরুদ্ধে সুরক্ষা দেয় এবং আক্রমণকারী তথ্য পেতে ছবিটি পড়তে চায় to আপনি একই সার্ভার থেকে চিত্রটি পরিবেশন করে বা ক্রস-অরিজিন রিসোর্স ভাগ করে নেওয়ার মাধ্যমে সমস্যাটি সমাধান করতে পারেন ।
.width
এবং .height
ক্যানভাসে নিজেই কনটেন্টেশনের মাধ্যমে নয়।
কানাভাস এটি করার এক দুর্দান্ত উপায় হবে, যেমন উপরে উপরে বলা হয়েছে @ পিএসটি একটি উত্তম উদাহরণের জন্য এই উত্তরটি দেখুন:
এইচটিএমএল ক্যানভাস থেকে পাইপিক্সেল?
কিছু কোড যা আপনাকে বিশেষভাবে পরিবেশন করবে:
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 এ রূপান্তর করতে হবে এবং হয় লুপের জন্য সরাসরি চেকে রূপান্তর করতে হবে বা একটি শর্তাধীন ভিতরে চালানো উচিত।
আপনার প্রশ্নটি আবার পড়ে, দেখে মনে হচ্ছে আপনি ব্যক্তি যে পয়েন্টটি ক্লিক করেছেন সেই পয়েন্টটি পেতে সক্ষম হবেন। এটি জ্যাকুরির ক্লিক ইভেন্টের সাহায্যে খুব সহজেই করা যায়। উপরের কোডটি কেবল একটি ক্লিক হ্যান্ডলারের ভিতরে চালিত করুন:
$('el').click(function(e){
console.log(e.clientX, e.clientY)
}
এগুলিকে আপনার এক্স এবং ওয়াইয়ের মানগুলি ধরা উচিত।
পূর্ববর্তী দুটি উত্তর ক্যানভাস এবং ইমেজডেটা কীভাবে ব্যবহার করবেন তা প্রদর্শন করে। আমি চলমান উদাহরণ এবং একটি চিত্র প্রক্রিয়াকরণ কাঠামো ব্যবহার করে একটি উত্তর প্রস্তাব করতে চাই, যাতে আপনাকে পিক্সেল ডেটা ম্যানুয়ালি হ্যান্ডেল করার প্রয়োজন হবে না।
মারভিনভিনজে মেথড ইমেজ.জেটএল্ফা কম্পোনেন্ট (এক্স, ওয়াই) সরবরাহ করে যা কেবল পিক্সেলের জন্য এক্স, ওয়াই স্থানাঙ্কিতে স্বচ্ছতার মান দেয়। যদি এই মান 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>