ডেটা থেকে প্যাটার্ন
QR কোড তৈরির শুরুতে ডেটার উপযোগী একটি এনকোডিং মোড বেছে নেওয়া হয়: সংখ্যা, অক্ষর-সংখ্যা মিশ্র, বাইট বা কাঞ্জি। এনকোডার ডেটাকে বিটে বদলে ৮ বিটের কোডওয়ার্ডে ভাগ করে এবং নির্বাচিত লেভেল অনুযায়ী Reed–Solomon এরর কারেকশন কোডওয়ার্ড যোগ করে। এরপর যে ছোটতম ভার্সনে ডেটা ধরে, সেটি বেছে নেয়।
কোডওয়ার্ডগুলো নির্দিষ্ট প্যাটার্ন এড়িয়ে আঁকাবাঁকা পথে গ্রিডে বসানো হয়। শেষে এনকোডার আটটি মাস্ক প্যাটার্নের একটি প্রয়োগ করে, যাতে বড় ফাঁকা অংশ বা বিভ্রান্তিকর আকার ভেঙে যায়, আর মাস্ক ও এরর কারেকশন লেভেল ফরম্যাট ইনফরমেশনে লিখে রাখে।
- এনকোডিং মোড বেছে নেওয়া
- ডেটা এনকোড করা ও এরর কারেকশন কোডওয়ার্ড যোগ করা
- ভার্সন (আকার) বেছে নেওয়া
- ফাইন্ডার, টাইমিং ও অ্যালাইনমেন্ট প্যাটার্ন বসানো
- ডেটা মডিউল ভরা
- আটটির মধ্যে সেরা মাস্ক প্রয়োগ করে ফরম্যাট ইনফরমেশন লেখা
ক্যামেরার ছবি থেকে ডেটা
ডিকোডিং একই ধাপগুলো উল্টো ক্রমে চালায়। স্ক্যানার তিনটি ফাইন্ডার প্যাটার্ন খুঁজে বের করে, যেগুলোর গাঢ়-হালকার ১:১:৩:১:১ অনুপাত বেশিরভাগ ছবির মধ্যে আলাদা করে চোখে পড়ে, এবং টাইমিং ও অ্যালাইনমেন্ট প্যাটার্নের সঙ্গে মিলিয়ে গ্রিডের নকশা বসায়। এরপর ফরম্যাট ইনফরমেশন পড়ে, মাস্ক সরায় ও কোডওয়ার্ড সংগ্রহ করে।
তারপর Reed–Solomon ডিকোডিং ভুল পড়া কোডওয়ার্ডগুলো মেরামত করে, এরর কারেকশন লেভেলের সীমা পর্যন্ত। বেশি ক্ষতি হলে কোড ভুল ডেটা না দিয়ে পড়তেই ব্যর্থ হয়, আর সে কারণেই QR কোড থেকে অর্থহীন ফলাফল খুব কমই আসে।
আকার ও কনট্রাস্ট কেন জরুরি
প্রতিটি ধাপ নির্ভর করে ক্যামেরা গাঢ় ও হালকা মডিউল আলাদা করতে পারার ওপর। ছোট মডিউল, কম কনট্রাস্ট, আলোর প্রতিফলন, ঝাপসা ভাব বা কোয়ায়েট জোন না থাকলে আরও বেশি মডিউল নিয়ে সন্দেহ তৈরি হয়, আর এরর কারেকশন একটা সীমা পর্যন্তই সামলাতে পারে। ডেটা ছোট, কনট্রাস্ট জোরালো ও মার্জিন পরিষ্কার রাখলে ডিকোডারের কাজ সবচেয়ে সহজ হয়।