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:

- 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.

Proses pembuatan: dari teks menjadi titik-titik
Kalau kita menulis QR code secara manual (atau membaca kode programnya), alurnya kira-kira begini:

Encoder (pembuat):
- 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.
- Susun bit stream — teks diubah menjadi deretan 0 dan 1.
- Tambahkan koreksi kesalahan — deretan bit diolah dengan algoritma Reed-Solomon untuk menghasilkan kata kode cadangan.
- Isi matriks — bit ditaruh ke dalam grid dengan pola zig-zag (naik-turun), melewati area pola fungsi.
- Masking — coba 8 pola mask, hitung skor penalti tiap pola (ada 4 aturan penilaian), lalu pakai pola dengan skor terendah.
- 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
- Kamera menangkap gambar QR.
- Scanner mencari 3 pola finder (rasio 1:1:3:1:1) untuk menentukan posisi dan orientasi, lalu memperbaiki perspektif kalau kodenya miring.
- Menentukan titik tengah tiap modul dan mengubahnya menjadi bit (gelap = 1, terang = 0).
- Membaca format info untuk mengetahui mode, level koreksi, dan pola mask → membalik proses masking.
- Memisahkan bit data dan bit koreksi, lalu Reed-Solomon memperbaiki bit yang salah karena kotor, sobek, atau tertutup sebagian.
- 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:
| Mode | Kapasitas 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 |
| Kanji | 1.817 karakter |
Selain versi, ada 4 level koreksi kesalahan yang bisa dipilih. Makin tinggi levelnya, makin tahan kode terhadap kerusakan, tapi kapasitas datanya mengecil:
| Level | Modul yang bisa rusak/tutup | Contoh 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.

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.