জাভাস্ক্রিপ্ট ক্যানভাসে মাস্কড ইমেজ বর্ডার আয়ত্ত করা
একাধিক ছবি ফিউশন জাভাস্ক্রিপ্ট ভিজ্যুয়াল ইফেক্ট তৈরির একটি সাধারণ পদক্ষেপ। একটি মুখোশের সাহায্যে একটি চিত্রের দর্শনীয় ক্ষেত্রগুলিকে সংজ্ঞায়িত করা একটি ঘন ঘন কৌশল। যদিও এটি অনন্য ফর্ম তৈরির জন্য সহায়ক, তবে সেই মুখোশযুক্ত আকারগুলির চারপাশে একটি সীমানা যুক্ত করা চ্যালেঞ্জিং হতে পারে। যদিও ক্যানভাস জাভাস্ক্রিপ্টের উপাদানটি ব্যাপক ইমেজ ম্যানিপুলেশন অফার করে, মাস্ক করা ছবির চারপাশে সীমানা সামঞ্জস্য করা সহজ নয়।
বিকাশকারীরা এর সাথে কল্পনাপ্রসূত উপায়ে মাস্ক এবং ক্লিপ ছবি প্রয়োগ করতে পারে ক্যানভাস API, যদিও ডিফল্টরূপে, যে কোনো সীমানা তৈরি করা ক্যানভাসের আয়তক্ষেত্রাকার আকৃতির সাথে মেলে। আপনি যখন একটি মাস্ক দ্বারা সংজ্ঞায়িত একটি জটিল আকারের প্রান্তের সাথে মেলে এমন একটি সীমানা তৈরি করতে চান, এটি একটি সমস্যা উপস্থাপন করে। উদ্দেশ্য সরল আয়তক্ষেত্রাকার সীমানা ছাড়িয়ে মুখোশের সুনির্দিষ্ট যাত্রা অনুসরণ করা।
এই পোস্টটি ব্যাখ্যা করবে কীভাবে জাভাস্ক্রিপ্টে একটি ইমেজ মাস্ক প্রয়োগ করতে হয় এবং আরও গুরুত্বপূর্ণভাবে, কীভাবে নিশ্চিত করা যায় যে মুখোশযুক্ত ছবির স্বতন্ত্র আকৃতিটি একটি সীমানা দ্বারা বেষ্টিত। অতিরিক্তভাবে, আমরা এমন একটি ফাংশন নিয়ে যাব যা মাস্কিং সম্পূর্ণ করে কিন্তু এখনও একটি সংজ্ঞায়িত সীমানা সমাধান নেই।
ক্যানভাসে যৌগিক ক্রিয়াকলাপগুলির সাথে কীভাবে কাজ করতে হয় তা শিখে আপনি সীমানার চেহারাটি সূক্ষ্ম-টিউন করতে পারেন। চলুন শুরু করা যাক এবং একটি মুখোশযুক্ত চিত্রের চারপাশে প্রয়োজনীয় সীমানা যুক্ত করতে জাভাস্ক্রিপ্টের ক্যানভাস বৈশিষ্ট্যগুলি কীভাবে ব্যবহার করবেন তা দেখুন।
আদেশ | ব্যবহারের উদাহরণ |
---|---|
globalCompositeOperation | ক্যানভাসে অঙ্কন ক্রিয়াগুলির গঠন এই বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা হয়। উদাহরণে globalCompositeOperation ='source-in' নিশ্চিত করে যে মুখোশ চিত্রটি মূল ছবিকে ক্লিপ করে যাতে শুধুমাত্র ছেদ করা এলাকাগুলি দেখা যায়। |
toDataURL() | Base64 এর সাথে এনকোড করা একটি ছবিতে ক্যানভাসের তথ্য রূপান্তরিত করে। এটি মাস্ক এবং বর্ডার প্রয়োগ করার পরে একটি PNG হিসাবে সমাপ্ত ছবি ব্যবহার করা সম্ভব করে তোলে। উদাহরণের ইমেজ আউটপুট canvas.toDataURL('image/png') ব্যবহার করে তৈরি করা হয়। |
crossOrigin | এই বৈশিষ্ট্যটি ক্যানভাসে একটি ভিন্ন ডোমেন থেকে লোড করা ছবির ব্যবহার সক্ষম করে নিরাপত্তা বিধিনিষেধকে সম্মান করে৷ MaskImg.crossOrigin = 'বেনামী' গ্যারান্টি দেয় যে মাস্ক ইমেজ অ্যাক্সেস CORS সমস্যা সৃষ্টি না করে করা যেতে পারে। |
beginPath() | ক্যানভাসে, এই পদ্ধতি ব্যবহার করে একটি নতুন পথ শুরু করা যেতে পারে। দ্বিতীয় পদ্ধতিটি ctx.beginPath() কে কল করে যাতে পাথটি মুখোশের কনট্যুর মেনে চলে কারণ এটি মুখোশযুক্ত চিত্রের চারপাশে একটি কাস্টম সীমানা আঁকে। |
moveTo() | এই পদ্ধতির সাথে, কোন অঙ্কন করা হয় না; পরিবর্তে, "কলম" একটি নতুন শুরুর জায়গায় সরানো হয়েছে। ctx.moveTo(0, 0) ব্যবহার করে উদাহরণে সীমানার শুরুর বিন্দুটি স্থাপন করা হয়েছে, যা মুখোশের সীমানার চারপাশে নির্ভুলভাবে সীমানা আঁকার জন্য অপরিহার্য। |
lineTo() | প্রদত্ত স্থানাঙ্কগুলিকে প্রারম্ভিক বিন্দু হিসাবে ব্যবহার করে, এই কৌশলটি একটি সরল রেখা আঁকে। মুখোশযুক্ত চিত্রের সীমানা ctx.lineTo(maskImg.width, 0) ব্যবহার করে সমাধানে আঁকা লাইন দ্বারা সংজ্ঞায়িত করা হয়। |
stroke() | নির্ধারিত পথ বরাবর, সীমানা বা লাইন আঁকে। উদাহরণস্বরূপ, moveTo() এবং lineTo() মাস্ক ফর্ম সংজ্ঞায়িত করতে ব্যবহৃত হয়, এবং তারপর ctx.stroke() মাস্ক করা চিত্রের চারপাশে বর্ডার প্রয়োগ করতে ব্যবহৃত হয়। |
lineWidth | ক্যানভাসে রেখাগুলি কতটা পুরু আঁকা হয়েছে তা নির্ধারণ করে। স্ক্রিপ্টটি ctx.lineWidth = 5 ব্যবহার করে মুখোশের আকৃতির চারপাশে একটি 5-পিক্সেল পুরু সীমানা স্থাপন করে। |
strokeStyle | সীমানার রঙ বা শৈলী নির্দেশ করে। উদাহরণে সীমানা রঙ ctx.strokeStyle = 'red' ব্যবহার করে লাল সেট করা হয়েছে। |
একটি মুখোশযুক্ত ছবিতে কীভাবে সীমানা প্রয়োগ করবেন তা সনাক্ত করা
প্রদত্ত স্ক্রিপ্টগুলির উদ্দেশ্য হল একটি চিত্রের জন্য একটি মুখোশ হিসাবে অন্য ছবি ব্যবহার করা এবং তারপর ব্যবহার করা ক্যানভাস API মুখোশ আকৃতির চারপাশে একটি কাস্টম সীমানা যোগ করতে। মুখোশ এবং প্রধান চিত্রের জন্য ফাংশনের শুরুতে দুটি নতুন ইমেজ অবজেক্ট তৈরি করা হয়। বাহ্যিক উত্স থেকে ফটো লোড করার সময়, CORS-এর কারণে সমস্যাগুলি প্রতিরোধ করতে ক্রস-অরিজিন সেটিং অপরিহার্য। একটি ক্যানভাস তৈরি হয় এবং উভয় ছবি লোড হয়ে গেলে এর অনুপাত মাস্ক ইমেজের সাথে সামঞ্জস্য করা হয়। এটি চিত্র অঙ্কনের সময় আকার পরিবর্তনের সমস্যাগুলি এড়ায় এবং গ্যারান্টি দেয় যে ক্যানভাসটি উপযুক্ত এলাকার সাথে কাজের জন্য প্রস্তুত করা হয়েছে।
স্ক্রিপ্ট তারপর ব্যবহার করে আঁকা ছবি() ক্যানভাসে মুখোশের ছবি আঁকার ফাংশন। এটি করার সময়, মুখোশটি ক্যানভাসে প্রয়োগ করা হয়, মাস্কিং পদ্ধতির ভিত্তি স্তর হিসাবে পরিবেশন করে। মাস্কটি সঠিকভাবে প্রয়োগ করার জন্য গ্লোবাল কম্পোজিট অপারেশনটিকে অবশ্যই "সোর্স-ইন" এ সেট করতে হবে। ক্যানভাসকে নির্দেশ দেওয়া হয়েছে শুধুমাত্র প্রাথমিক ছবির সেই ক্ষেত্রগুলি ধরে রাখতে যা মুখোশের ছবির সাথে মিলে যায়। সারমর্মে, মুখোশটি মূল চিত্রটি ক্লিপ করা আকৃতিকে সংজ্ঞায়িত করে। এই ক্লিপিং এলাকার ভিতরে মূল ছবি আঁকা হলে কম্পোজিট অপারেশন "সোর্স-ওভার"-এ রিসেট করা হয়, পূর্বে ক্লিপ করা বিষয়বস্তুকে প্রভাবিত না করেই বর্ডার পেইন্টিংয়ের মতো অতিরিক্ত ক্রিয়াকলাপ সক্ষম করে৷
মুখোশযুক্ত আকারে একটি সীমানা প্রয়োগ করা ব্যবহার করা জড়িত স্ট্রোক() কৌশল ক্যানভাসে নির্দিষ্ট পথ বা ফর্ম এই কমান্ড দ্বারা নির্দেশিত হয়। দ্বিতীয় সমাধানে, moveTo() এবং lineTo() ম্যানুয়ালি ক্যানভাস পাথ তৈরি করতে এবং মুখোশের সীমানা ট্রেস করতে একত্রিত হয়। এই কৌশলগুলি ব্যবহার করে, আপনি ম্যানুয়ালি সীমানার আকৃতি নির্দিষ্ট করতে পারেন এবং নিশ্চিত করতে পারেন যে এটি আয়তাকার ক্যানভাসের সীমানার পরিবর্তে মুখোশের আকৃতি মেনে চলে। আপনার সীমান্তের চেহারার উপর সম্পূর্ণ নিয়ন্ত্রণ আছে কারণ লাইন প্রস্থ সম্পত্তি সীমানা এর বেধ সেট করে এবং স্ট্রোক স্টাইল সম্পত্তি তার রঙ সেট করে।
সবশেষে, toDataURL() ফাংশনটি ক্যানভাসকে একটি বেস64 স্ট্রিং-এ রূপান্তর করতে ব্যবহৃত হয়। এটি করার মাধ্যমে, সমাপ্ত চিত্র - মাস্ক এবং বর্ডার অন্তর্ভুক্ত - একটি ফর্ম্যাটে রূপান্তরিত হয় যা প্রোগ্রামের অন্যান্য ক্ষেত্রে সহজেই ব্যবহার করা হয় বা একটি সার্ভারে আপলোড করা হয়। সময়ের ভুলগুলি এড়াতে, প্রতিশ্রুতি নিশ্চিত করে যে এই অপারেশনটি শুধুমাত্র তখনই শেষ হবে যখন দুটি ছবি সম্পূর্ণরূপে লোড হয়ে যাবে। এই স্ক্রিপ্টগুলি দেখায় যে কীভাবে জাভাস্ক্রিপ্টের ক্যানভাস উপাদানের সাথে সঠিকভাবে মেলে এমন একটি গতিশীল সীমানা মাস্কিং এবং প্রয়োগ করা সহ অত্যাধুনিক চিত্র পরিবর্তন কৌশলগুলি দেখায়।
পদ্ধতি 1: একটি মুখোশযুক্ত ছবিতে একটি কাস্টম সীমানা যুক্ত করতে ক্যানভাস এবং স্ট্রোক পদ্ধতি ব্যবহার করা
মুখোশযুক্ত চিত্রের চারপাশে একটি সীমানা তৈরি করার জন্য, এই পদ্ধতিটি জাভাস্ক্রিপ্ট এবং ক্যানভাস API ব্যবহার করে। স্ট্রোক() মুখোশ আকৃতির রূপরেখা করতে ব্যবহৃত হয়।
function applyFiltersAndConvertToBase64(imageUrl, materialImage) {
return new Promise((resolve, reject) => {
const maskImg = new Image();
const mainImg = new Image();
maskImg.crossOrigin = "anonymous";
mainImg.crossOrigin = "anonymous";
let imagesLoaded = 0;
const onLoad = () => {
imagesLoaded++;
if (imagesLoaded === 2) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = maskImg.width;
canvas.height = maskImg.height;
ctx.drawImage(maskImg, 0, 0);
ctx.globalCompositeOperation = 'source-in';
ctx.drawImage(mainImg, 0, 0, maskImg.width, maskImg.height);
ctx.globalCompositeOperation = 'source-over';
ctx.lineWidth = 5; // Border thickness
ctx.strokeStyle = 'red'; // Border color
ctx.stroke(); // Draw border around mask
const base64Image = canvas.toDataURL('image/png');
resolve(base64Image);
}
};
maskImg.onload = onLoad;
mainImg.onload = onLoad;
maskImg.onerror = reject;
mainImg.onerror = reject;
maskImg.src = imageUrl;
mainImg.src = materialImage;
});
}
বিকল্প 2: ক্যানভাস পাথ ব্যবহার করে মাস্ক আকৃতির চারপাশে একটি কাস্টম সীমানা তৈরি করুন
এই পদ্ধতি নিশ্চিত করে যে সীমানাটি জাভাস্ক্রিপ্টের সাথে ক্যানভাস API ব্যবহার করে ইমেজ মাস্ক পাথ অনুসরণ করে মুখোশযুক্ত আকৃতিটিকে ঘনিষ্ঠভাবে অনুসরণ করে।
function applyFiltersAndConvertToBase64(imageUrl, materialImage) {
return new Promise((resolve, reject) => {
const maskImg = new Image();
const mainImg = new Image();
maskImg.crossOrigin = "anonymous";
mainImg.crossOrigin = "anonymous";
let imagesLoaded = 0;
const onLoad = () => {
imagesLoaded++;
if (imagesLoaded === 2) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = maskImg.width;
canvas.height = maskImg.height;
ctx.drawImage(maskImg, 0, 0);
ctx.globalCompositeOperation = 'source-in';
ctx.drawImage(mainImg, 0, 0, maskImg.width, maskImg.height);
ctx.globalCompositeOperation = 'source-over';
// Create path for the mask shape
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(maskImg.width, 0);
ctx.lineTo(maskImg.width, maskImg.height);
ctx.lineTo(0, maskImg.height);
ctx.closePath();
ctx.lineWidth = 5; // Border thickness
ctx.strokeStyle = 'blue'; // Border color
ctx.stroke(); // Apply the border along the path
const base64Image = canvas.toDataURL('image/png');
resolve(base64Image);
}
};
maskImg.onload = onLoad;
mainImg.onload = onLoad;
maskImg.onerror = reject;
mainImg.onerror = reject;
maskImg.src = imageUrl;
mainImg.src = materialImage;
});
}
জাভাস্ক্রিপ্টে কাস্টম বর্ডার সহ মুখোশযুক্ত চিত্রগুলি উন্নত করা
আপনার জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনটির ব্যবহারকারীর অভিজ্ঞতাটি চিত্রগুলিকে মাস্ক করার এবং কাস্টম সীমানা সেট করার ক্ষমতা দ্বারা ব্যাপকভাবে উন্নত করা যেতে পারে ক্যানভাস API. মুখোশের সাহায্যে, আপনি একটি চিত্রের কোন অংশগুলি দৃশ্যমান তা অন্য একটি চিত্রের উপর নির্ভর করে নির্ধারণ করতে পারেন, যা মাস্ক নামে পরিচিত। মুখোশযুক্ত অঞ্চলের চারপাশে একটি সীমানা যুক্ত করা একটি সমস্যা যা অনেক বিকাশকারীর মুখোমুখি হয়, বিশেষত যখন মুখোশটি একটি সরল আয়তক্ষেত্রাকার আকৃতি নয়। মাস্কের রূপরেখার সাথে অবিকল মেলে এমন সীমানা সহ প্রকল্পগুলি আরও পালিশ এবং বিশেষজ্ঞ দেখাবে।
এই সমস্যার একটি কার্যকর সমাধান হল Canvas API ব্যবহার করা পাথ2ডি বস্তু আপনি Path2D ব্যবহার করতে পারেন জটিল রুট ডিজাইন করতে যা আপনার মুখোশের কনট্যুরগুলির সাথে মানানসই হয় এবং তারপরে একটি সীমানা দিয়ে ঘিরে থাকে। এই পদ্ধতিটি আপনাকে সীমানা তৈরি করতে দেয় যা আপনার কাস্টম মাস্কের কোণগুলির সাথে সঠিকভাবে মেলে, প্রচলিত আয়তক্ষেত্রের বাইরে গিয়ে। ব্যবহার করে moveTo() এবং lineTo() একসাথে এটি মুখোশের রূপরেখা ট্রেস করা সহজ করে তোলে এবং একটি সীমানা নিশ্চিত করে যা সুনির্দিষ্টভাবে সারিবদ্ধ।
কর্মক্ষমতা বিবেচনায় নেওয়ার আরেকটি গুরুত্বপূর্ণ বিষয়, বিশেষ করে যখন বড় ইমেজ নিয়ে কাজ করা বা রিয়েল-টাইমে গতিশীলভাবে সীমানা প্রয়োগ করা। মুখোশযুক্ত ছবি ক্যাশ করা, অঙ্কন ক্রিয়াকলাপ হ্রাস করা এবং ক্যানভাস রেন্ডারিং প্রক্রিয়াকে সুগম করার মতো কৌশলগুলি ব্যবহার করে আপনার অ্যাপ্লিকেশনের গতি উন্নত করা যেতে পারে। এমনকি জটিল বা উচ্চ-পারফরম্যান্স সেটিংসেও, আপনি গ্যারান্টি দিতে পারেন যে মাস্কিং এবং বর্ডার-অঙ্কন পদ্ধতিগুলি অর্থহীন ক্রিয়াগুলি হ্রাস করে মসৃণভাবে চলে।
ক্যানভাস ব্যবহার করে মাস্কিং এবং বর্ডারিং ইমেজ সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্ন
- জাভাস্ক্রিপ্টে, আমি কীভাবে একটি মাস্ক করতে অন্য একটি চিত্র ব্যবহার করতে পারি?
- ব্যবহার করে 2 সেট 'source-in', ব্যবহার করে একটি ইমেজ মাস্ক করার জন্য ক্যানভাসে মুখোশ আঁকুন ক্যানভাস API. মুখোশের সাথে মিল করার জন্য, এটি প্রাথমিক চিত্রটি ক্রপ করবে।
- আমি কীভাবে একটি মুখোশযুক্ত চিত্রের একটি সীমানা তৈরি করতে পারি যা তার আকারের সাথে সামঞ্জস্যপূর্ণ?
- সঙ্গে মাস্ক এর রুট প্রতিষ্ঠার পর moveTo() এবং lineTo(), ব্যবহার করুন stroke() কৌশল এটি আপনাকে একটি ব্যক্তিগতকৃত সীমানা দিয়ে মুখোশের আকারকে ঘিরে রাখতে দেবে।
- উদ্দেশ্য কি toDataURL() ক্যানভাস ম্যানিপুলেশনে?
- এর মাধ্যমে ক্যানভাসের বিষয়বস্তু একটি বেস64-এনকোডেড ছবিতে রূপান্তরিত হয় toDataURL() ফাংশন, এটি একটি PNG ইমেজ হিসাবে ব্যবহার বা বিতরণ করা সহজ করে তোলে।
- আমি কিভাবে কর্মক্ষমতা জন্য ক্যানভাস অপারেশন অপ্টিমাইজ করতে পারি?
- অঙ্কন ক্রিয়াকলাপের পরিমাণ হ্রাস করুন এবং ক্যানভাসের গতি সর্বাধিক করতে সাধারণত ব্যবহৃত উপাদানগুলি সংরক্ষণ করার বিষয়ে চিন্তা করুন। এটি আপনার অ্যাপ্লিকেশনটিকে মসৃণভাবে কাজ করে এবং পুনরায় আঁকার সংখ্যা হ্রাস করে।
- আমি কি একটি ক্যানভাসে ক্রস-অরিজিন ছবি লোড করতে পারি?
- হ্যাঁ, কিন্তু CORS অসুবিধা না করে ইমেজটি উপলব্ধ করার জন্য, আপনাকে সেট করতে হবে crossOrigin সম্পত্তি 'anonymous'.
মাস্কিং এবং সীমানা সম্পর্কে চূড়ান্ত চিন্তা
জাভাস্ক্রিপ্ট অ্যাপে, ইমেজ মাস্ক করা এবং ক্যানভাসে কাস্টম বর্ডার প্রয়োগ করা পালিশ ভিজ্যুয়াল উপাদান তৈরি করার একটি কার্যকর উপায়। ডেভেলপারদের ব্যবহার করে ছবির রেন্ডারিং এবং স্টাইলিং ম্যানিপুলেট করার ক্ষমতা আছে ক্যানভাস API এবং অত্যাধুনিক অঙ্কন কমান্ড যেমন স্ট্রোক() এবং পথের সংজ্ঞা।
মসৃণ কর্মক্ষমতা সাবধানে সীমানা অপ্টিমাইজ করে এবং মাস্কিং অপারেশন নিশ্চিত করা হয়, বিশেষ করে বড় ছবির জন্য। এই টিউটোরিয়ালটি অ-আয়তক্ষেত্রাকার চিত্রগুলির চারপাশে গতিশীলভাবে সীমানা আঁকার জন্য একটি দরকারী পদ্ধতি প্রদান করে, যা নান্দনিকভাবে আনন্দদায়ক এবং প্রতিক্রিয়াশীল উভয়ই অনলাইন অ্যাপ্লিকেশনগুলি বিকাশ করার সময় দরকারী।
ক্যানভাসে মাস্কিং এবং বর্ডার টেকনিকের জন্য রেফারেন্স
- ব্যবহার সম্পর্কে বিস্তারিত নির্দেশিকা ক্যানভাস API ছবি এবং মুখোশ ম্যানিপুলেট করতে, যেমন অঙ্কন অপারেশন সহ 4 এবং 2: MDN ওয়েব ডক্স .
- জাভাস্ক্রিপ্টে কীভাবে ইমেজ মাস্কিং এবং ক্রস-অরিজিন রিসোর্স পরিচালনা করতে হয় তার ব্যাপক ব্যাখ্যা: HTML5 ক্যানভাস টিউটোরিয়াল .
- ক্যানভাস-ভিত্তিক অ্যাপ্লিকেশনগুলির জন্য পারফরম্যান্স টিপস, ইমেজ রেন্ডারিং এবং অঙ্কন অপারেশনগুলি অপ্টিমাইজ করার উপর ফোকাস করে: স্ম্যাশিং ম্যাগাজিন .