Cara Kerja QR Code: Kenapa Titik-Titik “Acak” Itu Menyimpan Data

Hampir tiap hari kita memindai QR code — bayar di warung, buka menu restoran, sambungkan Wi-Fi, sampai login WhatsApp Web. Bentuknya seperti kumpulan titik hitam-putih yang tampak acak, tapi setiap kali discan, datanya keluar utuh: URL, teks, atau nomor rekening. Kok bisa? Ternyata titik-titik itu tidak acak sama sekali. Ini catatan belajar saya tentang cara kerja QR code dari sisi teknisnya.

Awal mula: dari barcode garis ke kotak-kotak

QR code (kependekan dari Quick Response code) ditemukan tahun 1994 oleh Masahiro Hara di perusahaan Jepang Denso Wave (anak perusahaan Toyota), awalnya untuk melacak suku cadang mobil di pabrik. Berbeda dari barcode 1D yang cuma menyimpan data secara horizontal, QR code menyimpan data dalam dua arah (matriks), sehingga kapasitasnya jauh lebih besar dan bisa dibaca lebih cepat — makanya dinamai “quick response”.

Menariknya, Denso Wave memilih tidak mengeksploitasi hak patennya, sehingga QR code bebas dipakai siapa saja. Standarnya kemudian dibakukan dalam ISO/IEC 18004. Itulah kenapa QR bisa muncul di struk, kartu nama, iklan, sampai kuburan.

Titik “acak” itu sebenarnya bit

Setiap titik kecil di QR code disebut modul, dan satu modul menyimpan satu bit: modul hitam = 1, modul putih = 0. Scanner tinggal membaca deretan bit itu dan menerjemahkannya menjadi teks. Kalau hanya itu, kenapa bentuknya tidak seperti barcode sederhana saja?

Karena QR code punya aturan ketat: ada pola fungsi (function patterns) yang wajib ada supaya kamera bisa menemukan, mengorientasikan, dan mengukur kode dengan cepat. Sisa area yang kosong baru diisi data dengan pola zig-zag tertentu, lalu dimasking supaya tidak muncul pola yang menyesatkan pembaca. Hasil akhirnya memang terlihat acak — tapi itu hasil rekayasa, bukan kebetulan.

Anatomi QR code

Gambar di bawah adalah QR code versi 6 (41×41 modul) yang menyimpan URL blog ini, dengan bagian-bagiannya diwarnai:

Anatomi QR code: finder pattern, separator, timing, alignment, dark module, area data
Anatomi QR code versi 6 (41×41 modul)
  • 3 pola finder (merah): kotak di tiga sudut dengan rasio gelap-terang 1:1:3:1:1. Pola ini sangat jarang muncul di area lain, jadi scanner mudah menemukannya dan langsung tahu orientasi kode — itulah kenapa QR bisa dibaca dari arah mana pun (360°).
  • Separator (oranye): batas putih satu modul di sekeliling finder, supaya pola finder tidak tertukar dengan data di dekatnya.
  • Pola timing (biru): garis putus-putus antara finder yang memberi tahu scanner ukuran grid (berapa modul per baris/kolom).
  • Pola alignment (hijau): kotak kecil pembantu agar scanner tetap bisa membaca saat kode miring atau terdistorsi (ada di versi 2 ke atas).
  • Dark module (ungu): satu modul hitam yang selalu ada, bagian dari area format info.
  • Area data (abu-abu): bit data + koreksi kesalahan + format info (mode, level koreksi, pola mask).

Pola finder: rasio 1:1:3:1:1

Tiga kotak sudut (finder) itu berukuran 7×7 modul. Kalau diiris tepat di tengah, baris tengahnya membentuk pola gelap-terang dengan perbandingan 1:1:3:1:1 — satu hitam, satu putih, tiga hitam, satu putih, satu hitam. Scanner memindai piksel, mencari rasio persis ini, lalu langsung tahu: ini QR code, di mana sudut-sudutnya, dan arah yang benar.

Pola finder QR code 7x7 dengan rasio gelap-terang 1:1:3:1:1
Pola finder 7×7: baris tengah = 1 hitam · 1 putih · 3 hitam · 1 putih · 1 hitam

Proses pembuatan: dari teks menjadi titik-titik

Kalau kita menulis QR code secara manual (atau membaca kode programnya), alurnya kira-kira begini:

Diagram alur pembuatan QR code (encode) dan pembacaan (decode)
Dari teks ke QR code (encode) dan kembali ke teks (decode)

Encoder (pembuat):

  1. Analisis data — pilih mode paling efisien: numerik (0-9), alfanumerik (A-Z, 0-9, simbol), byte (teks biasa/UTF-8), atau Kanji. Tulis header berisi mode + panjang data.
  2. Susun bit stream — teks diubah menjadi deretan 0 dan 1.
  3. Tambahkan koreksi kesalahan — deretan bit diolah dengan algoritma Reed-Solomon untuk menghasilkan kata kode cadangan.
  4. Isi matriks — bit ditaruh ke dalam grid dengan pola zig-zag (naik-turun), melewati area pola fungsi.
  5. Masking — coba 8 pola mask, hitung skor penalti tiap pola (ada 4 aturan penilaian), lalu pakai pola dengan skor terendah.
  6. Tulis format & version info — QR code siap dicetak.

Kenapa harus masking? Karena kalau area data dibiarkan apa adanya, bisa muncul blok hitam besar atau pola yang mirip finder — dan itu akan membingungkan scanner. Masking “mengacak” area data secara teratur (misal: balik warna tiap baris genap, atau tiap 3 kolom) sehingga hasilnya seimbang. Scanner membaliknya lagi pakai info pola mask yang disimpan di format info.

Proses pembacaan: dari gambar kembali ke teks

  1. Kamera menangkap gambar QR.
  2. Scanner mencari 3 pola finder (rasio 1:1:3:1:1) untuk menentukan posisi dan orientasi, lalu memperbaiki perspektif kalau kodenya miring.
  3. Menentukan titik tengah tiap modul dan mengubahnya menjadi bit (gelap = 1, terang = 0).
  4. Membaca format info untuk mengetahui mode, level koreksi, dan pola mask → membalik proses masking.
  5. Memisahkan bit data dan bit koreksi, lalu Reed-Solomon memperbaiki bit yang salah karena kotor, sobek, atau tertutup sebagian.
  6. Menerjemahkan bit menjadi teks asli — selesai, dalam hitungan milidetik.

Versi, kapasitas, dan level koreksi

QR code punya 40 versi ukuran: versi 1 berukuran 21×21 modul, setiap naik versi bertambah 4 modul per sisi, sampai versi 40 dengan 177×177 modul. Makin besar versinya, makin banyak data yang bisa ditampung. Kapasitas maksimum (pada level koreksi L) kira-kira:

ModeKapasitas maksimum (versi 40, level L)
Numerik (0-9)7.089 digit
Alfanumerik (A-Z, 0-9, simbol)4.296 karakter
Byte (teks biasa, UTF-8)2.953 byte
Kanji1.817 karakter

Selain versi, ada 4 level koreksi kesalahan yang bisa dipilih. Makin tinggi levelnya, makin tahan kode terhadap kerusakan, tapi kapasitas datanya mengecil:

LevelModul yang bisa rusak/tutupContoh pemakaian
L (Low)± 7%Data banyak, ruang cetak sempit
M (Medium)± 15%Standar umum
Q (Quartile)± 25%Permukaan kasar, sering terlipat
H (High)± 30%Kode diberi logo di tengah

Itulah kenapa QR yang sebagian tertutup logo atau sobek masih bisa dibaca — yang rusak ditambal oleh data cadangan Reed-Solomon. Coba saja: tempel stiker kecil di tengah QR di bawah ini, biasanya tetap ke-scan.

Contoh QR code yang bisa dipindai mengarah ke rudyhartadi.web.id
Coba scan: QR ini menyimpan URL rudyhartadi.web.id

Kesimpulan

QR code terlihat seperti titik acak, padahal semuanya terstruktur: pola fungsi untuk navigasi, bit data yang diatur zig-zag, cadangan Reed-Solomon untuk ketahanan, dan masking untuk keterbacaan. Yang membuatnya “ajaib” bukanlah keacakan, melainkan redundansi dan aturan yang ketat — di balik setiap scan, ada algoritma yang bekerja dalam hitungan milidetik.

Sumber

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.